assets:precompile問題
Rails3.1+capistranoの続き的なもの。 しばらくローカルでassets:precompileする運用をやっていたが、色々問題があった。具体的には以下のような感じ。
- デザインの細かな修正ごとにprecompileするので、コミットがassets:precompileだらけになる。
- precompileした状態でdevelopment環境をロードすると、coffeescriptで書いた関数が2回実行されたりおかしなことになる。
- Rails3.2だとprecompile時にデフォルトでproductionデータベースに接続しようとするので、そのままのdatabase.ymlのままローカルで実行するとエラーになる。(これは一応RAILS_ENV=development rake assets:precompileで解決可能)
と言うわけで改善を試みた。 参考にしたのはstackoverflowのこのスレ。
まず、Capfileにload ‘deploy/assets’を追加する。この時、必ずload ‘config/deploy’よりも先にすること。そうしないと後述のnamespaceが有効にならない。 次にdeploy.rbに以下のnamespaceを定義。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
namespace :assets do | |
task :precompile, :roles => :web, :except => { :no_release => true } do | |
from = source.next_revision(current_revision) | |
if capture("cd #{latest_release} && #{source.local.log(from)} vendor/assets/ app/assets/ | wc -l").to_i > 0 | |
run %Q{cd #{latest_release} && #{rake} RAILS_ENV=#{rails_env} #{asset_env} assets:precompile} | |
else | |
logger.info "Skipping asset pre-compilation because there were no asset changes" | |
end | |
end | |
end |
これでassetsのnamespaceが上書きされ、app/assets以下に変更があった時のみリモートでassets:precompileが行われるようになる。 万事解決良かった良かった。
のはずが、環境によってはprecompileが失敗することがある(この問題?)。ソースを追っかけたけどよく分からなかった。3.2.2で解決したかなぁ。