ruby-on-rails - Rails 部署 - 运行 Assets :precompile once per deployed environment or only once per build?

标签 ruby-on-rails sass

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/

相关文章:

ruby - 指南针 watch 错误 - Mac OS X

node.js - node-sass-middleware 未编译

ruby-on-rails - 在Ruby on Rails应用程序中搜索和嵌入youtube视频

ruby-on-rails - 带有Ransack的Tire Gem用于Elasticsearch

javascript - JSON 从 Rails 到 Angularjs

html - 如何在文本顶部设置 ol 列表数字?

webpack - Webpack、SASS 和 FontAwesome 的问题

javascript - watch 和 sass 的不同 grunt 任务

ruby-on-rails - 目录 : How to load the related record in a one-to-one relationship

ruby-on-rails - 如何在Rails 3.1中的项目创建过程中删除 “bundle install”命令?