Rails部署 - 运行资产:每个部署环境预编译一次或每个构建只预编译一次?

时间:2012-10-16 20:21:11

标签: ruby-on-rails sass

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

2 个答案:

答案 0 :(得分:0)

我解决了非常类似的问题。我们的解决方案是为每个单独的环境运行预编译 - 在我们的情况下是分段和生产环境。原因是相同的 - 不同的资产主机。

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

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

答案 1 :(得分:0)

将public / assets / manifest.yml检入源代码管理