2011-10-28 60 views
3

我在使用资产管道和预编译Capistrano任务部署大型应用程序的想法陷入困境。Rails 3.1资产管道生产无法使用javascript运行时环境

  1. 我不想安装javascript运行时环境并预编译每个生产服务器上的资产。

  2. 资产需要上传到两个没有应用程序副本的Nginx服务器。

所以我创建了一个Capistrano的任务在本地预编译的资产,然后上传资产的Nginx的服务器和清单文件到应用服务器。

问题是我本地计算机上的资产可能与我部署的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

你说在你的本地计算机资产可能从不同的部署分支。在正常情况下,您的开发环境不需要编译资产。

这样做我建议你改变你的任务,在资产部署完成后删除它们,任何时候都保持本地工作副本的清洁。这可以保证每个部署获取最新(正确)版本的文件。 (如果你不这样做,我还建议你使用dev模式的默认选项,它依赖于Sprockets来完成所有的资产服务)。

+0

资产可能会有所不同,因为源青菜和咖啡文件可能有最近的变化(未提交的修改,未跟踪文件等)。我倾向于承诺编译的资产(但也觉得很脏)。我认为不必在生产服务器上编译资产,然后将它们从生产服务器scp到正确的位置(nginx服务器)。 –

+0

如果没有编译的文件,那么所有的资源都是动态提供的。这没有发生?另外,如果您使用主分支作为生产/稳定,那么我没有发现提交它们的任何错误。 –

+0

在开发中是的,它们是动态服务的。在生产中,它们不能动态地提供服务nginx提供预编译的文件。我只想提出一种更好的方式来预编译它们并将它们上传到nginx服务器。 –

0

我不认为将文件提交到repo并将其部署到Nginx服务器 - 这与供应商缓存中的宝石类似 - 这是多余的,但这是有原因的。

另一种选择是将应用程序实际部署到您的Nginx服务器,并让Capistrano在那里编译资产,但不在这些服务器上启动应用程序(为“资产”创建Capistrano角色并将应用程序部署到它,但不要在该角色上启动它)。这可能会有点混乱...

作为最后一种选择,如果您不想让您的资产服务器的水域变得浑浊,或者希望让您的选项可以在其他地方部署资产,那么您可以让Capistrano git stash任何未保存的更改首先检查主分支,然后编译资产,上传它们,删除它们,结帐前一个分支(git checkout -),重新应用保存的更改(git stash apply --index),然后继续! :)

资源:

http://git-scm.com/book/en/Git-Tools-Stashing

Is there any way to git checkout previous branch?