TL;DR:运行 assets:precompile 将生产 Assets 主机注入(inject)到为非生产环境生成的 Assets 中。
背景:目前我们部署 Rails 应用程序的方式是 CI 服务器将每个成功的构建作为 tarball 部署到集成环境。这个 tarball 一直被提升到 prod env。但甚至在我们将应用程序打包以推广到不同环境之前,我们运行
rake assets:precompile
在压缩之前运行此命令后,我们最终将编译后的 Assets 作为压缩包的一部分,这节省了各个环境的部署时间(预编译很慢)。
问题: 在我们在生产环境中引入 asset_host 属性之前,这种安排工作得很好。因为 assets:precompile 默认在 Production env 中运行,并且 sass 文件使用 image-url 标签引用图像 Assets ,asset host 开始被预编译选中,并且生成的 Assets 开始直接 URL 引用到 production asset_host 的服务器。显然这是 Not Acceptable 。
在互联网上搜索导致了这个 Github Issue这是对我遇到的问题的非常接近的描述。看到 gem 维护者的 react ,似乎运行 assets:precompile once for ALL environments instead of once PER environment 似乎是一个坏主意。但是考虑到预编译时间很慢,这似乎是我们唯一的方法。
那么其他 Rails 部署是如何处理这个问题的?
最佳答案
我正在解决非常相似的问题。我们的解决方案是为每个单独的环境运行预编译——在我们的例子中是暂存和生产环境。原因是一样的 - 不同的 Assets 托管方。
如果可以,请仅在必要且确实需要 Assets 的环境中运行预编译。
我们使用 Capistrano 与 capistrano-ext
gem 一起进行部署。这允许我们指定不同的阶段以及每个阶段特定于阶段的设置和方法(如果阶段 == 环境,则为环境)。
关于ruby-on-rails - Rails 部署 - 运行 Assets :precompile once per deployed environment or only once per build?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12922782/