【发布时间】:2017-02-06 22:44:18
【问题描述】:
问题
我们部署的应用程序中包含开发依赖项。我们有很多开发依赖项。这会增加工件大小和生产中的内存消耗,因为所有这些依赖项都是require'd。大多数实例都部署在云中,因此更多的内存 = 更大的实例需要更多的钱。我们希望减少大小/内存,并在部署的工件和开发环境之间进行更清晰的分离。一个特别的重点是在生产环境中需要therubyrhino,即使我们的资产是预编译的。
上下文
This question 有一些投票率极高的 cmets 提出了同样的问题(请参阅 this one 和 this one),但我实际上没有看到任何答案。
查看Rails upgrade guide,建议如下:
同样,资产预编译是使用以下命令完成的:RAILS_ENV=production rake assets:precompile
正如链接问题中所讨论的,这意味着生产中需要所有 gem。从根本上说,这对我来说没有意义,我觉得我错过了一些明显的东西。资产预编译的全部意义在于我们避免在生产中这样做,所以这个命令(据我所知)应该是这样的:RAILS_ENV=development RAILS_ENV_TARGET=production rake assets:precompile
或者一些生意。
我已经阅读了关于旧 Rails 票 here 的讨论,似乎没有回答这个问题 - 我们如何从生产环境中获取开发依赖项?一位用户特别总结了同样的问题here
我仍然感到震惊的是,生产中的 rubyracer 等默认情况下的内存膨胀很差,特别是如果预编译是核心的建议并且在这一点上被广泛接受的最佳实践。许多人可能永远不会停止考虑,即使他们在资产组被删除后来到 Rails,或者从未考虑过它是否能达到这一目的——至少在生成的 Gemfile 中提供建议性评论可能是个好主意。
现在,对于开发人员来说,由于从预编译任务中删除了加载组,因此对于他们知道在生产 Web 或工作进程中不需要的 gem,现在可以解决这个问题。我现在基本上将其作为样板包含在新应用程序中:
namespace :assets do # Override sprockets-rails task to put back assets group require, so as to # avoid memory bloat in web processes :-/ task :environment do Bundler.require(:assets) Rake::Task['environment'].invoke end end
加上将Bundler.require(*Rails.groups(assets: %w[development test]))恢复为config/application.rb。真是一团糟。仅供参考,du 在我的机器上报告 rubyracer 为 17MB,并且它不使用自动加载。我们没有使用任何 CoffeeScript 视图模板。
该评论的作者提出了一种解决方法,但稍后在线程中讨论了该策略的缺陷,这让我感到紧张。
tl;博士:
我们如何从生产运行时移除开发依赖项?或者,我错过了什么,为什么这种能力是可取的/默认的?
【问题讨论】:
标签: ruby-on-rails-4 asset-pipeline bundler precompile dev-to-production