TL; DR:正在运行的资产:预编译将生产资产主机注入到非生产环境的生成资产中。
背景:我们部署Rails应用程序的当前方式是CI服务器将每个成功的构建部署为集成环境作为tarball。而这个tarball一直在升级到prod env。但是,即使在我们将应用程序转移到不同的环境之前,我们也会运行
rake assets:precompile
在tarring之前运行此命令后,我们最终将编译后的资产作为tarball的一部分,这样可以节省单个环境的部署时间(预编译是sloow)。
问题: 在我们在生产环境中引入asset_host属性之前,这种安排很好。因为资产:预编译默认在生产环境中运行,并且sass文件使用image-url标记引用图像资产,资产主机开始被预编译拾取,生成的资产开始具有对生产的直接URL引用asset_host的服务器。显然这是不可接受的。
在互联网上搜索导致了这个Github Issue,这是对我遇到的问题的非常详细的描述。看到gem维护者的反应,它似乎正在运行资产:为所有环境预编译一次而不是一次PER环境似乎是一个坏主意。但鉴于预编译时间较慢,它似乎是我们的唯一方式。
那么其他Rails部署如何处理这个问题呢?
答案 0 :(得分:0)
我解决了非常类似的问题。我们的解决方案是为每个单独的环境运行预编译 - 在我们的情况下是分段和生产环境。原因是相同的 - 不同的资产主机。
如果可以,只在必要的环境和真正需要资产的环境中运行预编译。
我们正在使用Capistrano与capistrano-ext
gem一起进行部署。这允许我们指定不同的阶段和每个阶段特定于阶段的设置和方法(如果阶段==环境,则指定环境)。
答案 1 :(得分:0)
将public / assets / manifest.yml检入源代码管理