我正在努力使用资产管道和预编译Capistrano任务部署大型应用程序。
我不想安装javascript运行时环境并在每个生产服务器上预编译资产。
需要将资产上传到两个没有应用副本的Nginx服务器。
所以我创建了一个Capistrano任务,在本地预编译资产,然后将资产上传到Nginx服务器,将清单文件上传到app服务器。
问题是我本地计算机上的资产可能与我正在部署的git分支的资产不同。
有没有更好的方法,或者我必须总是从正确的干净分支部署?
namespace :assets do
after "deploy:update_code", "assets:precompile"
after "assets:precompile", "assets:upload_assets"
after "assets:precompile", "assets:upload_manifest"
desc "precompile assets"
task :precompile do
run_locally("bundle exec rake assets:clean && bundle exec rake assets:precompile RAILS_ENV=#{rails_env}")
end
desc "precompile and upload assets to webserver"
task :upload_assets, :roles => :nginx do
top.upload( "public/assets", "/usr/local/fieldphone/#{rails_env}/", :via => :scp, :recursive => true)
end
#
desc "upload manifest file"
task :upload_manifest, :roles => :app do
top.upload( "public/manifest.yml", "#{release_path}/public/", :via => :scp )
end
end
答案 0 :(得分:0)
您说本地计算机上的资产可能与部署分支上的资产不同。在正常情况下,您的开发环境不需要编译资产。
因此,我建议您在部署资源后更改任务以删除资产,并始终保持本地工作副本的清洁。这可以保证每个部署都获得最新(正确)的文件版本。 (如果您没有这样做,我还建议您使用dev模式的默认选项,它依赖于Sprockets来完成所有资产服务。)
答案 1 :(得分:0)
我认为将文件提交到repo并将其部署到Nginx服务器并没有什么问题 - 这类似于宝石的供应商缓存 - 这是多余的,但有一个原因。
另一种选择是将应用程序实际部署到您的Nginx服务器,并让Capistrano在那里编译资产,但不在这些服务器上启动应用程序(为“资产”创建Capistrano角色并将应用程序部署到它,但是不要在那个角色上启动它)。这可能会有点混乱......
作为最后一种选择,如果您不想混淆资产服务器的水域,或者希望保持打开选项以便在其他地方部署资产,那么您可以先让Capistrano git stash
进行任何未保存的更改,签出主分支,然后编译资产,上传,删除它们,签出上一个分支(git checkout -
),重新应用隐藏的更改(git stash apply --index
),然后继续! :)
<强>资源:强>