Rails部署-运行资产:每个部署的环境预编译一次,还是每个构建只预编译一个



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

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

rake assets:precompile

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

问题:在我们在生产环境中引入asset_host属性之前,这种安排一直运行良好。由于默认情况下assets:precompile在Production env中运行,并且sass文件使用image url标记引用图像资产,因此预编译开始获取资产主机,生成的资产开始具有对生产asset_host服务器的直接url引用。显然,这是不可接受的。

在互联网上搜索导致了这个Github问题,这是对我遇到的问题的一个非常接近的描述。看到gem维护人员的反应,似乎运行资产:为ALL环境预编译一次,而不是为PER环境预编译,这似乎是个坏主意。但考虑到预编译时间缓慢,这似乎是我们的唯一途径

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

我正在解决非常相似的问题。我们的解决方案是为每个单独的环境运行预编译——在我们的案例中,这些环境是暂存和生产环境。原因是相同-不同的资产宿主。

如果可以的话,只在需要和真正需要资产的环境中运行预编译。

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

将public/assets/manifest.yml检查到源代码管理中

最新更新