3

TL;DR:运行 assets:precompile 将生产资产主机注入到为非生产环境生成的资产中。

背景:我们部署 Rails 应用程序的当前方式是 CI 服务器将每个成功的构建作为 tarball 部署到集成环境中。而且这个 tarball 一直被提升到 prod env。但即使在我们 tar 应用程序以推广到不同的环境之前,我们运行

rake assets:precompile

一旦这个命令在 tarring 之前运行,我们最终将编译的资产作为 tarball 的一部分,这节省了单个环境的部署时间(预编译很慢)。

问题:在我们在生产环境中引入asset_host 属性之前,这种安排运行良好。因为 assets:precompile 默认在生产环境中运行,并且 sass 文件使用 image-url 标签引用图像资产,所以资产主机开始被预编译拾取,并且生成的资产开始具有对生产环境的直接 URL 引用资产主机的服务器。显然这是不能接受的。

在互联网上搜索导致了这个Github 问题,这是对我遇到的问题的非常接近的描述。看到 gem 维护者的反应,似乎运行 assets:precompile once for ALL 环境而不是一次 PER 环境似乎是个坏主意。但是考虑到预编译时间很慢,这似乎是我们唯一的方法。

那么其他 Rails 部署是如何处理这个问题的呢?

4

2 回答 2

0

检查 public/assets/manifest.yml 到源代码控制

于 2013-04-05T09:21:26.737 回答
0

我正在解决非常相似的问题。我们的解决方案是为每个单独的环境运行预编译——在我们的例子中是登台和生产环境。原因是一样的——不同的资产主机。

如果可以,请仅在必要且真正需要资产的环境中运行预编译。

capistrano-ext我们正在使用 Capistrano 与gem一起进行部署。这允许我们指定不同的阶段以及每个阶段特定于阶段的设置和方法(或环境,如果阶段 == 环境)。

于 2012-10-25T20:19:26.510 回答