Sinatraからrails-assets.orgを使う

先日

Sinatra AssetPackを試してみた - あーありがち(2014-07-19)

において Sinatra でも Asset Pipieline のようなことができてある程度満足していたのだが、Bower の部分は実は解決しておらず、もやもやしていた。

bower componentsをどうやってproduction環境にinstallするのか

具体的には deploy まで考えた際に bower components をどう扱うのがよりよい選択なのかが見えていなかった。恐らく解決方法は以下の二つのいずれかになると思う。

  1. bower_components も git repository に入れる
  2. deploy process の中で bower components の install を実行する

1 については実は Bower 界隈でも答えは出ていないっぽい。

この辺の扱いももやもやするが、単純な話、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-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 を使ってみた。いい具合だった。

More