把 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