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 部署是如何处理这个问题的呢?