Rails 3.1资产管道生产环境下无JavaScript运行时环境

3
我正在思考如何使用asset pipeline和precompile Capistrano任务部署大型应用程序的问题。
以下是我的一些需求:
1.我不想在每个生产服务器上安装javascript运行环境并预编译资产。
2.资产需要上传到两个Nginx服务器,这两个服务器都没有该应用程序的副本。
因此,我创建了一个Capistrano任务,该任务可以在本地预编译资产,然后将资产上传到Nginx服务器,同时将清单文件上传到应用服务器。但是,问题在于,我本地机器上的资产可能与我正在部署的git分支上的资产不同。
有没有更好的方法来解决这个问题?或者我必须始终确保从正确的干净分支部署?
下面是执行预编译和上传的Capistrano任务:
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

我认为将文件提交到版本库并将其部署到Nginx服务器并没有什么问题——这类似于用于gem的供应商缓存,重复但有原因存在。

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

最后一种选择是,如果您不想混淆资产服务器的状况,或者想保持在其他地方部署资产的选项,您可以让Capistrano首先git stash任何未保存的更改,检出主分支,然后编译资产、上传它们、删除它们、检出之前的分支(git checkout -),重新应用隐藏的更改(git stash apply --index),然后继续!:)

资源:

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

有没有办法在 Git 中切换到以前的分支?


0

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

既然如此,我建议你修改任务,在部署后删除资源,使你的本地工作副本始终保持清洁。这将确保每次部署都获取最新(正确)版本的文件。(如果你没有这样做,我还建议你使用开发模式的默认选项,依赖于 Sprockets 来完成所有资源服务)。


资产可能会有所不同,因为源Sass和Coffee文件可能有最近的更改(未提交的更改,未跟踪的文件等)。我倾向于提交已编译的资产(但这也感觉很不好)。我认为在生产服务器上编译资产然后从生产服务器将它们scp到正确的位置(nginx服务器)是不必要的。 - Aaron Renoir
如果没有编译文件,那么所有资产都是动态提供的。这不是发生了吗?另外,如果您将主分支用作生产/稳定版本,则我认为提交它们没有任何问题。 - Richard Hulse
在开发环境中,它们是动态提供的。在生产环境中,它们不是动态提供的,而是由Nginx服务器提供预编译文件。我只想找到更好的方法来预编译它们并将它们上传到Nginx服务器。 - Aaron Renoir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接