2011-11-24 86 views
4

我希望資產預編譯發生在我的開發機器上,而且代碼被capistrano打包(tar ball'ed),並且已將預編譯的資產包含在最終部署包中。Capistrano部署之前開發機器上的資產預編譯

當我嘗試在 load 'deploy/assets'內置的Capistrano的配方,多數民衆贊成它運行 rake RAILS_GROUPS=assets assets:precompile在服務器上。

我尋找這個的原因是因爲此時預編譯在我的EC2微實例上花費太長時間(並且有時只是掛起), 如果資產編譯甚至可以在部署之前完成開始,這樣我就可以將服務器從這種繁重的工作負載中拯救出來 - 直到至少我有更好的配置服務器可用。

回答

3

目前工作流程仍然有點顛簸,但您可能會發現使用Guard-Rails-Assets取得了一些成功。這有點慢,特別是如果您正在進行大量資產更改,但它會在更改資產時編譯資產,並且您可以將它們檢入到您的資產回購中以稍後進行部署。

+0

這聽起來像一個合理的方法:) – thanikkal

3

我剛剛寫了一個gem來解決Rails裏的這個問題,叫做turbo-sprockets-rails3。它僅通過重新編譯更改的文件來加速您的assets:precompile,並且只編譯一次即可生成所有資產。它爲Capistrano開箱即用,因爲您的資產目錄在版本之間共享。

如果您可以幫助我測試turbo-sprockets-rails3寶石,並且讓我知道您是否有任何問題,那將會非常棒。

+0

+1彌敦道,這確實是偉大的工作。一定會把它添加到我的項目中,讓你知道。然後可能會考慮切換接受的答案:) – thanikkal

+0

彌敦道,這不適合我。我一直得到「未定義的方法摘要」爲nil:NilClass「,您是否希望我提供任何細節以便我們能夠指出這一點?我將在github上提交問題 – thanikkal

+0

Hi @thanikkal,感謝您的反饋!請更新寶石到最新版本,然後重試,我認爲它應該是固定的。 – ndbroadbent

1

Capfileconfig/deploy.rb刪除load 'deploy/assets',並添加以下行config/deploy.rb

 
set :assets_role, [ :web, :app ] 
set :normalize_asset_timestamps, false 
set :assets_tar_path, "#{release_name}-assets.tar.gz" 

before "deploy:update" do 
    run_locally "rake assets:precompile" 
    run_locally "cd public; tar czf #{Dir.tmpdir}/#{assets_tar_path} assets" 
end 

before "deploy:finalize_update", :roles => assets_role, :except => { :no_release => true } do 
    upload "#{Dir.tmpdir}/#{assets_tar_path}", "#{shared_path}/#{assets_tar_path}" 
    run "cd #{shared_path}; /bin/tar xzf #{assets_tar_path}" 
    run "/bin/ln -s #{shared_path}/assets #{release_path}/public" 
    run "/bin/rm #{shared_path}/#{assets_tar_path}" 
end 

如果使用turbo-sprockets-rails3,這增加了最後一塊:

 
    run "cd #{release_path}; #{rake} assets:clean_expired 2> /dev/null"