2011年9月7日水曜日

rails3.1.0でasset pipe lineの問題発見(と解決方法)

■概要
rails3.1.0で、productionモードにてasset pipe lineを使うには、一般的には rake assets:precompile を利用すると思いますが(さもなくばエラーになります)、実行すると下記の用になります。
$ rake assets:precompile
$ ls -la public/assets/
合計 544
drwxrwxr-x 2 kj kj   4096  9月  6 01:33 .
drwxrwxr-x 3 kj kj   4096  9月  6 01:33 ..
-rw-rw-r-- 1 kj kj  96110  9月  6 01:27 application-2438fd50052a4a5b81204dc6fb.js
-rw-rw-r-- 1 kj kj  33515  9月  6 01:27 application-2438fd50052a4a5b81204dc6fb.js.gz
-rw-rw-r-- 1 kj kj      0  9月  6 01:27 application-4635849c44627859332fda6a01.css
-rw-rw-r-- 1 kj kj     20  9月  6 01:27 application-4635849c44627859332fda6a01.css.gz
-rw-rw-r-- 1 kj kj  91273  8月 15 22:49 jquery-ed8d29566738ad005e19fe1c2d.min.js
-rw-rw-r-- 1 kj kj  32054  8月 15 22:49 jquery-ed8d29566738ad005e19fe1c2d.min.js.gz
-rw-rw-r-- 1 kj kj 198431  8月 15 22:49 jquery-ui-2a28fc84ad0e0e47e46cbf901c.min.js
-rw-rw-r-- 1 kj kj  50610  8月 15 22:49 jquery-ui-2a28fc84ad0e0e47e46cbf901c.min.js.gz
-rw-rw-r-- 1 kj kj    318  9月  6 01:33 manifest.yml
-rw-rw-r-- 1 kj kj   6646  9月  6 01:26 rails-a560b5a3a7be0808c5cd76a798.png
上記にjqueryとjquery-uiが含まれている事が理解できません。application.jsの中にはjqueryが内包されています。またjquery-uiはSprocketsのディレクティブで指定もしていません。良くわからない挙動なので追跡してみました。

■原因
actionpack-3.1.0/lib/sprockets/assets.rake にdebuggerを仕込み動きを追いましたが、
 
 26         config.assets.precompile.each do |path|
 27           env.each_logical_path do |logical_path|
 28             if path.is_a?(Regexp)
 29               next unless path.match(logical_path)
 30             else
 31               next unless File.fnmatch(path.to_s, logical_path)
 32             end
 33
...
上記の28行目のpathは、config.assets.precompileの配列のメンバーですが、デフォルトでは
[ /\w+\.(?!js|css).+/, /application.(css|js)$/ ]
になっています(railties-3.1.0/lib/rails/application/configuration.rb 38行目)
上記配列の一番目は、rails.png等jsやcss以外の為に存在しますが、このままではjquery.min.jsやjquery-ui.minjsも29行目でヒットしてしまうじゃないか!!!という事に気付きました。

■解決方法
直してやれ!と思いましたが既に問題になってました。よって
  • 上記もうすぐ取り込まれそうなので3.1.1?を待つ
  • とりあえずconfig/environments/production.rb config.assets.precompile = [ /\.(?!js$|css$)\w+$/, /application.(css|js)$/ ] とする
辺りで対応しましょう。

■2011/09/11追記
解決されている様です。あるべき姿になった感じです! https://github.com/rails/rails/commit/082f53a3bca9dce70adcf41094e246d2c9fed934

0 件のコメント:

コメントを投稿