在我的rails服务器中,当我使用命令capistrano
通过cap production deploy
将我的代码从本地计算机(Mac PC)部署到生产计算机(Linux Ubuntu)时,除资产外,一切都正常文件更新。
我发现很多时候我的资产文件js和css都没有更新。有时它会更新,有时会失败。失败的概率约为80%。 如果它通过了,我可以得到如下的通行日志,它显示带指纹的新js文件。
INFO [1fccb6d2] Running bundle exec rake assets:precompile as deploy@xx.xxxx.xxxx.xxx
DEBUG [1fccb6d2] Command: cd /home/deploy/myeyehouse/releases/20160528162211 && ( RAILS_ENV=production bundle exec rake assets:precompile )
DEBUG [1fccb6d2] [DEPRECATION] requiring "RMagick" is deprecated. Use "rmagick" instead
DEBUG [1fccb6d2] I, [2016-05-29T00:23:08.129214 #14695] INFO -- : Writing */home/deploy/myeyehouse/releases/20160128162211/public/assets/application-cdfb70e59238ab6d9142e0baba154b101ea4aef9b0a0cab3ea528469faed3704.js*
INFO [1fccb6d2] Finished in 8.168 seconds with exit status 0 (successful).
对于下面的失败日志,它不会显示任何js文件。
INFO [b8b2d3fc] Running bundle exec rake assets:precompile as deploy@xx.xx.xxx.xxx
DEBUG [b8b2d3fc] Command: cd /home/deploy/myeyehouse/releases/20160622164438 && ( RAILS_ENV=production bundle exec rake assets:precompile )
DEBUG [b8b2d3fc] [DEPRECATION] requiring "RMagick" is deprecated. Use "rmagick" instead
INFO [b8b2d3fc] Finished in 3.724 seconds with exit status 0 (successful).
当它失败时,我的新js文件当然不会更新到我的生产服务器。然后访问我的服务器的用户将收到严重错误。
我试图在我的生产服务器RAILS_ENV=production rake assets:precompile
上执行命令,它仍然无法正常工作。没有生成任何新的js文件。
奇怪的是,当我在本地机器上执行此命令时,它工作了!! 因此,我当前的解决方案解决方案是在我的本地计算机上执行预编译命令,并将此文件推送到我的生产中以替换旧版本。 但这会导致另一个问题,带有预编译文件指纹的文件名不会改变,因此一些用户仍然会因浏览器缓存而导致错误,直到刷新页面为止。 我认为这不是处理这个问题的好方法。有人遇到过这个问题吗?
我的服务器语言是RoR(Ruby on Rails)
在本地环境rails version 4.2.2
,ruby version 2.1.2p95
在生产环境rails version 4.2.4
上,ruby version 2.2.2p95
我使用的宝石:capistrano-rails
,capistrano-passenger
,carrierwave
,rmagick
,mysql2
,deivise
......