Rails 资产管道提供旧清单

Rails asset pipeline serves old manifests

使用 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

如您所见,这是一个完全不同的版本,这就是我希望我的应用服务器现在提供的服务。但不幸的是,它并没有发生多次导致问题。

但是我注意到但没有解释的一件事是,有时它工作正常。最新版本在某些部署后提供。

这里有什么问题吗?

你应该永远不要在你的资产目录中有一个以上的清单文件。那是你的问题。

Rails(实际上是 Sprockets)选择它找到的第一个清单文件(source). It might be new, it might be old; there is no guarantee. A manifest uses a completely random 文件名。唯一可以保证使用正确清单的方法是只有一个清单文件。

首先下载您的服务器正在使用的清单,运行 assets:precompile 在此基础上进行更新,然后 re-upload。否则每次预编译时都会创建一个新的清单,从而导致这些问题。