【问题标题】:Rails not using new manifest-*.json file after deployRails 部署后未使用新的 manifest-*.json 文件
【发布时间】:2014-04-18 22:46:50
【问题描述】:

我正在使用 capistrano 部署 Rails 应用程序并在本地编译资产并使用 rsync 将它们复制到服务器。这就是预编译中发生的事情

desc 'Run the precompile task locally and rsync with shared'
task :precompile, :roles => :web, except: { no_release: true } do
  run "rm -f #{shared_path}/assets/manifest*"
  %x{RAILS_ENV=production bundle exec rake assets:precompile}
  %x{rsync -rave "ssh -i #{ssh_options[:keys][0]}" public/assets #{user}@#{domain}:#{shared_path}}
  %x{RAILS_ENV=production bundle exec rake assets:clean}
  %x{rm -rf public/assets}
end

部署完成后,资源在服务器上显示正常,但 rails 应用程序不显示最新的资源文件。它显示了最后一个清单文件中的文件。我通过在 capistrano 中运行 run "rm -f #{shared_pa​​th}/assets/manifest*" 删除了旧的清单文件,但是 rails 应用程序没有选择新的清单。我缺少什么以及如何在部署后强制它使用最新的清单文件。

【问题讨论】:

  • 每个人都想出一个解决方案?从 Rails 3 -> 4 升级后,我遇到了类似的行为。黑客解决方案是部署两次。不理想:-/
  • 也很想知道是否有人找到了解决此问题的方法
  • 这里有同样的问题。我尝试升级到最新的稳定链轮(2.12.3),然后改用 sprockets-rails(2.2.2)。还尝试在我的服务器上运行assets:clean,希望有某种缓存。运气不好!
  • 仅供参考 - Sprockets 选择它可以找到的第一个清单文件。见第 50 行:github.com/sstephenson/sprockets/blob/master/lib/sprockets/…

标签: ruby-on-rails capistrano assets precompile


【解决方案1】:

据我所知:

  1. 默认情况下,Capistrano 不会删除清单文件的早期版本
  2. 如果有多个,Sprockets 只会选择第一个
  3. 拥有多个清单文件会破坏 Cap 2 的 deploy:assets:update_asset_mtimes 任务

你需要做的是:

  1. 在预编译流程中添加一个步骤以删除 manifest.*json 文件
  2. 为每个版本制作一份清单副本,并将其放在名为assets_manifest.jsonrelease_path 的根目录下。第 2 章需要 :clean_expired:rollback

我可以通过在deploy:assets:symlink 任务之前删除manifest*.json 文件来解决此问题。 capistrano-local-precompile gem 是我在这方面的线索。请参阅:remove_manifest task 并参考问题 #3,因为它不太正确。

【讨论】:

    【解决方案2】:

    FWIW 我们通过在 application.rb 中设置显式清单解决了这个问题:

    config.assets.manifest = File.join('config', '.sprockets-manifest.json')
    

    【讨论】:

      猜你喜欢
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 2015-01-23
      • 2011-08-20
      • 2020-09-09
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多