Rails在部署后不使用新的清单 - * .json文件

时间:2014-04-18 22:46:51

标签: ruby-on-rails capistrano assets precompile

我正在使用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中运行运行“rm -f#{shared_pa​​th} / assets / manifest *”来删除旧的清单文件,但rails应用程序没有选择新的清单。我缺少什么,如何在部署后强制它使用最新的清单文件。

2 个答案:

答案 0 :(得分:1)

据我所知:

  1. 默认情况下,Capistrano不会删除清单文件的先前版本
  2. 如果有多个
  3. ,链轮将选择第一个
  4. 拥有多个清单文件会破坏第2章deploy:assets:update_asset_mtimes任务
  5. 您需要做的是:

    1. 在预编译流程中添加一个步骤以删除manifest.*json文件
    2. 为位于release_path assets_manifest.json :clean_expired的根目录下的每个版本制作清单副本。第2章需要:rollbackmanifest*.json
    3. 我能够通过删除deploy:assets:symlink任务之前的{{1}}文件来解决此问题。 capistrano-local-precompile宝石就是这一点。请参阅:remove_manifest task并参考问题#3,因为它不太正确。

答案 1 :(得分:0)

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

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