把 assets 包成 rails 的 gem 非常簡單,只要簡單4個步驟!(更多 rails assets gems 請參照 rails-assets

1. Create Gem Framework

bundle gem  momentjs-rails

2. Start Your Engine

bundler 產生的 gem 是一個標準 ruby 模組,但我們希望他是 rails engine

# lib/momentjs-rails.rb

require "momentjs-rails/version"

module Momentjs
  module Rails
    class Engine < ::Rails::Engine
    end
  end
end

3. Add The Assets

下載需要放進 gem 的 assets,建議放沒有壓縮也沒有編譯過的版本,因為可以讓 assets-pipeline 來幫我們做壓縮就好。

mkdir -p vendor/assets/javascripts
cp ~/Downloads/moment.js vendor/assets/javascripts/moment.js

補充說明:app/assets, lib/assets, vendor/assets 有什麼不同?

  • app/assets: 一般在開發調整的 js, css(會一直修正的)
  • lib/assets: 自有專案內打包模組化的 js, css(例如:backme-bootstrap.js)
  • vendor/assets: 第三方的 js, css,不會去變動的(例如:bootstrap.js)

4. Complete The Gemspec

裡面的 TODOs 都要解決,不然會沒辦法成功的編譯成 gem,然後拿掉 spec.executables 跟 spec.test_files 這兩行,因為裡面沒有 .rb 檔案需要被執行,只是單純打包起來,所以用不到。

把 spec.files 改掉:

spec.files = Dir["{lib,vendor}/**/*"] + ["MIT-LICENSE", "README.md"]

接著再下 gem build momentjs-rails.gemspec 即可完成。

實際使用

# Gemfile
gem "momentjs-rails", path: "{your gem file directory}"

# app/assets/javascripts/application.js
//= require moment

外譯:Gemify Assets for Rails