#!/usr/bin/env ruby require 'digest' require 'fileutils' def fingerprint(file_path) # file_path is relative to public public_file_path = "public/#{file_path}" return unless File.exists?(public_file_path) digest = Digest::MD5.file public_file_path extension = File.extname(file_path) basename = File.basename(file_path, extension) dirname = File.dirname(file_path) new_file_path = "#{dirname}/#{basename}-#{digest}#{extension}" new_public_file_path = "public/#{new_file_path}" FileUtils.mv(public_file_path, new_public_file_path) index_content = File.read("public/index.html") index_content.gsub!(file_path, new_file_path) File.open("public/index.html", "w") { |f| f.write index_content } end fingerprint('scripts/app.js') fingerprint('styles/app.css') fingerprint('styles/dashboard.css')