Sinatraからrails-assets.orgを使う
先日
Sinatra AssetPackを試してみた - あーありがち(2014-07-19)
において Sinatra でも Asset Pipieline のようなことができてある程度満足していたのだが、Bower の部分は実は解決しておらず、もやもやしていた。
bower componentsをどうやってproduction環境にinstallするのか
具体的には deploy まで考えた際に bower components をどう扱うのがよりよい選択なのかが見えていなかった。恐らく解決方法は以下の二つのいずれかになると思う。
- bower_components も git repository に入れる
- deploy process の中で bower components の install を実行する
1 については実は Bower 界隈でも答えは出ていないっぽい。
- Checking in front-end dependencies
- Bower Team の人の言葉も引用しながら決断例を紹介
- Bower入門(応用編) - from scratch
- bower-grunt-task を入れると不必要なファイルを repository に入れずに済むっぽいが、grunt を使ってもらわなければいけない
この辺の扱いももやもやするが、単純な話、Ruby 向け PaaS を使う場合、そもそも
bower install
を自由に実行できるのだろうか。bundle install はもはや常識だろう。だが bower install はどうだ? そもそも node.js は入っているのか? npm は入っているのか?
これが 2 の部分の疑問である。2 が解決するなら 1 で悩む必要はない。(もちろん、deploy のタイミングで外部の repository が落ちていたらどうする?と言った問題は残るが)
そうするとやはり全部 gem で解決できる方が何かと面倒がない。最近は「そもそも gem でないものを gem で install できるようにするためだけに依存性の複雑さが増すのはよくないのではないか」という考えも増えてきているが、しかし現実には gem でないと自由に install できるかどうかは分からない。生サーバや IaaS なら自由だろうけど PaaS だとちょっとね。
- rails と bower を組み合わせて assets を良い感じに使う術 - HsbtDiary(2014-06-17)
- RailsプロジェクトにBowerを導入してHerokuへデプロイする - QNYP Blog
rails-assets.orgはrailsじゃなくても使えるのでは?
https://rails-assets.org の存在は以前から知っていたし、前回の記事にも取り上げていたんだけど、名前から単純に Rails 専用だと思っていた。しかし、待てよ。
rails-assets.org が解決してくれるのは「bundler だけで bower components を install できるようにする」という部分だけで、実際に assets を探して読み込んでくれるのは Asset Pipeline の仕事なのでは?
ということで試したらできた。前回と同じ jQuery 1.10 を bower components として利用する場合は以下のように書くとよい。
Gemfile
(snip
source 'https://rails-assets.org'
(snip
gem 'rails-assets-jquery', '< 1.11'
Sinatraアプリ
assets do
serve '/assets/javascripts', from: 'assets/javascripts'
serve '/vendor/assets/jquery', from: 'vendor/ruby/2.0.0/gems/rails-assets-jquery-1.10.2/vendor/assets/javascripts/jquery'
js :app, '/javascripts/appication.js', [
'assets/javascripts/a.js',
'assets/javascripts/b.js',
'vendor/assets/jquery/jquery.js'
]
js_compression :uglify
end
うおーだせぇ(笑)
要は Rails が自動で解決してくれる部分を手で書いただけ。
とは言えこれで
- bundler が使えれば bower components を install することができ
- 必要な assets を読み込むことができる
ということで、今度こそ見えている課題は全部クリアになったはず!
おまけ
jsmin は obsolete だし copyright も潰してしまうので、UglifyJS を使ってみた。いい具合だった。