God*_*emo 61 capistrano ruby-on-rails ruby-on-rails-3.1 asset-pipeline
我的部署速度很慢,至少需要3分钟.部署期间缓慢的Capistrano任务是资产:预编译.这大约占总部署时间的99%.我怎样才能加快速度呢?我应该在我的本地计算机上预编译我的资产并将它们添加到我的git仓库吗?
编辑:添加config.assets.initialize_on_precompile = false到我的application.rb文件,半分钟后删除预编译时间,但它仍然很慢.
tom*_*sop 84
我们的想法是,如果您不更改资产,则无需每次都重新编译它们:
这是Ben Curtis建议使用git进行部署的解决方案:
namespace :deploy do
namespace :assets do
task :precompile, :roles => :web, :except => { :no_release => true } do
from = source.next_revision(current_revision)
if releases.length <= 1 || 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
end
Run Code Online (Sandbox Code Playgroud)
这是另一种基于资产年龄的方法(https://gist.github.com/2784462):
set :max_asset_age, 2 ## Set asset age in minutes to test modified date against.
after "deploy:finalize_update", "deploy:assets:determine_modified_assets", "deploy:assets:conditionally_precompile"
namespace :deploy do
namespace :assets do
desc "Figure out modified assets."
task :determine_modified_assets, :roles => assets_role, :except => { :no_release => true } do
set :updated_assets, capture("find #{latest_release}/app/assets -type d -name .git -prune -o -mmin -#{max_asset_age} -type f -print", :except => { :no_release => true }).split
end
desc "Remove callback for asset precompiling unless assets were updated in most recent git commit."
task :conditionally_precompile, :roles => assets_role, :except => { :no_release => true } do
if(updated_assets.empty?)
callback = callbacks[:after].find{|c| c.source == "deploy:assets:precompile" }
callbacks[:after].delete(callback)
logger.info("Skipping asset precompiling, no updated assets.")
else
logger.info("#{updated_assets.length} updated assets. Will precompile.")
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
如果您希望在本地预编译资产,则可以使用此任务:
namespace :deploy do
namespace :assets do
desc 'Run the precompile task locally and rsync with shared'
task :precompile, :roles => :web, :except => { :no_release => true } do
from = source.next_revision(current_revision)
if releases.length <= 1 || capture("cd #{latest_release} && #{source.local.log(from)} vendor/assets/ app/assets/ | wc -l").to_i > 0
%x{bundle exec rake assets:precompile}
%x{rsync --recursive --times --rsh=ssh --compress --human-readable --progress public/assets #{user}@#{host}:#{shared_path}}
%x{bundle exec rake assets:clean}
else
logger.info 'Skipping asset pre-compilation because there were no asset changes'
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
另一种有趣的方法可以是使用git钩子.例如,您可以添加此代码以.git/hooks/pre-commit检查资产文件是否存在任何差异,并最终预编译它们并将它们添加到当前提交.
#!/bin/bash
# source rvm and .rvmrc if present
[ -s "$HOME/.rvm/scripts/rvm" ] && . "$HOME/.rvm/scripts/rvm"
[ -s "$PWD/.rvmrc" ] && . "$PWD/.rvmrc"
# precompile assets if any have been updated
if git diff-index --name-only HEAD | egrep '^app/assets' >/dev/null ; then
echo 'Precompiling assets...'
rake assets:precompile:all RAILS_ENV=production RAILS_GROUPS=assets
git add public/assets/*
fi
Run Code Online (Sandbox Code Playgroud)
如果您决定使用此方法,则可能需要更改config/environments/development.rb添加:
config.assets.prefix = '/assets_dev'
Run Code Online (Sandbox Code Playgroud)
因此,在开发过程中,您将无法提供预编译资产.
ndb*_*ent 46
我刚刚编写了一个gem来解决Rails中的这个问题,称为turbo-sprockets-rails3.它assets:precompile通过仅重新编译已更改的文件来加速您的速度,并且仅编译一次以生成所有资产.它开箱即用于Capistrano,因为您的资产目录在版本之间共享.
这比使用的解决方案更加防弹git log,因为我的补丁分析了资产的来源,即使它们来自宝石.例如,如果更新jquery-rails,将检测到更改application.js,并且仅application.js重新编译.
请注意,我也试图将此补丁合并到Rails 4.0.0,可能还有Rails 3.2.9(参见https://github.com/rails/sprockets-rails/pull/21).但是现在,如果你可以帮我测试一下turbo-sprockets-rails3宝石会很棒,如果你有任何问题请告诉我.
| 归档时间: |
|
| 查看次数: |
28974 次 |
| 最近记录: |