How to deploy Rails 4 with Capistrano 2 and precompile assets locally

Recently I upgraded an application from Rails 3 to Rails 4. In the deploy scripts I precompile the assets locally and then rsync them up to the server(s). In Rails 4 the asset pipeline now produces manifest- < random > .json instead of a manifest.yml . Since the manifest files are named differently, this adds multiple manifest.json files to the shared assets directory. The application then picks up the wrong manifest file, and serves old assets.

I have read about various issues related to this in some github pull request threads:

  • https://github.com/capistrano/capistrano/pull/412
  • https://github.com/capistrano/capistrano/issues/210
  • https://github.com/capistrano/capistrano/pull/281
  • My options seem to be:

  • Don't share the asset directory.

    This would break old clients asking for old resources.

  • Switch to compiling assets on the servers.

    This would add complexity to the server.

  • Move the manifest file outside of the shared asset directory.

    I have since learned that this option was removed in Rails 4.

  • Are there other solutions to this problem?


    I found the best answer after looking at the standard capistrano rails asset precompile task. I added a command to the local precompile task that moves the old asset manifest to the current release as asset_manifest.json. This leaves only one manifest when the new one is uploaded.

    run "mv -- #{shared_manifest_path.shellescape} #{current_path.to_s.shellescape}/assets_manifest#{File.extname(shared_manifest_path)}".compact

    Moving the manifest-.json to the current_dir as asset_manifest.json allows capistrano to restore the correct manifest file on rollback.

    链接地址: http://www.djcxy.com/p/81102.html

    上一篇: 从github定制gem

    下一篇: 如何在Capistrano 2上部署Rails 4并在本地预编译资源