使用 Rails 4.0.0 应用程序在服务器上预编译资产需要花费很长时间,有时这个过程会被杀死所以我切换到在本地执行此操作,将其压缩并上传到服务器
它解决了速度问题。但是我遇到了另一个问题,即我们的Rails服务器没有服务上传到服务器的最新资产,即使它们已经重复重启。
为了说明这一点,我们的应用正在投放的application.css
版本application-dc02e058cd956b2492c840315ccbff7f.css
服务器上可用的清单文件是 -
ubuntu@production-app01:/mnt/snapshot-production/current/public/assets$ ls -lt manifest-*
-rw-rw-r-- 1 app app 203032 Jan 17 05:32 manifest-3365253428e645b923e834b54fb530ea.json
-rw-rw-r-- 1 app app 203032 Jan 6 17:02 manifest-44c2495f77ae0b10489563653d482136.json
-rw-rw-r-- 1 app app 203032 Dec 30 08:53 manifest-bbe38eefd3a3671b8d1d7bf524307413.json
-rw-rw-r-- 1 app app 203212 Dec 30 08:36 manifest-7fde3fe5c6247d724bf36a7aa9baee53.json
如果我试图查找哪些清单引用当前提供的application.css,我会得到以下内容 -
ubuntu@production-app01:/mnt/snapshot-production/current/public/assets$ grep -rl application-dc02e058cd956b2492c840315ccbff7f.css manifest-*.json
manifest-44c2495f77ae0b10489563653d482136.json
manifest-7fde3fe5c6247d724bf36a7aa9baee53.json
manifest-bbe38eefd3a3671b8d1d7bf524307413.json
正如您所看到的,它是从我拥有的3个旧版本的清单文件中提供的。
如果我尝试从最新的清单文件(1月17日)中查找正在提供的application.css
版本 - manifest-3365253428e645b923e834b54fb530ea.json
-
ubuntu@production-app01:/mnt/snapshot-production/current/public/assets$ grep -Po application*.css manifest-3365253428e645b923e834b54fb530ea.json
manifest-3365253428e645b923e834b54fb530ea.json:application-58eb91ccbe7698274d351e16b9b281aa.css
manifest-3365253428e645b923e834b54fb530ea.json:application-58eb91ccbe7698274d351e16b9b281aa.css
你可以看到它完全不同,这就是我期望我的应用服务器现在服务的东西。但不幸的是,它不会发生很多次问题。
但有一件事我注意到但没有解释,有时它工作正常。某些部署后会提供最新版本。
这里有什么问题吗?
答案 0 :(得分:2)
您应该从不在资产目录中有多个清单文件。那是你的问题。
Rails(实际上是Sprockets)选择它找到的第一个清单文件(source)。它可能是新的,可能是旧的;没有保证。清单使用completely random文件名。如果只有一个清单文件,则使用唯一可以保证正确清单的方法。
首先下载服务器正在使用的清单,然后在其上运行assets:precompile
进行更新,然后重新上传。否则,每次预编译时,您都会创建一个新的清单,从而导致这些问题。