OpsWorks:多次预编译的资产

Posted

技术标签:

【中文标题】OpsWorks:多次预编译的资产【英文标题】:OpsWorks: assets precompiled multiple times 【发布时间】:2015-10-04 18:26:28 【问题描述】:

我正在使用 AWS OpsWorks 部署 Rails 应用程序。为了预编译资产,我使用了以下 Chef 配方:

node[:deploy].each do |application, deploy|

    deploy_to = node[:deploy][application][:deploy_to]
    rails_env = node[:deploy][application][:rails_env]

    directory "#deploy_to/shared/assets"

    link "#deploy_to/current/public/assets" do
      to "#deploy_to/shared/assets"
    end

    execute "rake assets:precompile" do
      cwd "#deploy_to/current"
      command "bundle exec rake assets:precompile"
      environment "RAILS_ENV" => rails_env
    end

end

它可以正确预编译,但在后续部署中,它会再次经历整个预编译过程,即使没有修改任何资产并且资产文件夹是共享的。我还按照here 的建议尝试了一个厨师钩子,结果相同。你怎么能让它只在需要的时候运行呢?

【问题讨论】:

【参考方案1】:

您可以在语句中添加 not_if 或 only_if 子句:

类似这样的:

execute "rake assets:precompile" do
  cwd "#deploy_to/current"
  command "bundle exec rake assets:precompile"
  environment "RAILS_ENV" => rails_env
  not_if  File.exists?("<path to expected precompiled asset>") 
end

如果你想让它在每次某个目录发生变化时运行,你可以使用chef notifications。

【讨论】:

以上是关于OpsWorks:多次预编译的资产的主要内容,如果未能解决你的问题,请参考以下文章

OpsWorks - 自定义食谱中包含的内容

资产预编译错误

为啥预编译资产不再起作用?

预编译 Rails AngularJS 资产

预编译资产失败的 Rails

Rails:预编译资产缺少节点模块