Rails 3.1资产管道生产w / out javascript运行时环境

时间:2011-10-28 18:10:53

标签: ruby-on-rails-3 capistrano asset-pipeline

我正在努力使用资产管道和预编译Capistrano任务部署大型应用程序。

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

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

  3. 所以我创建了一个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
    

2 个答案:

答案 0 :(得分:0)

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

因此,我建议您在部署资源后更改任务以删除资产,并始终保持本地工作副本的清洁。这可以保证每个部署都获得最新(正确)的文件版本。 (如果您没有这样做,我还建议您使用dev模式的默认选项,它依赖于Sprockets来完成所有资产服务。)

答案 1 :(得分: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?