ruby-on-rails - view教程 - ruby on rails知乎




减少rake资产的内存消耗:预编译 (2)

问题:
在执行rake assets:precompile时,我将耗尽内存rake assets:precompile自动构建中的rake assets:precompile任务。 有没有什么策略可以执行增量式预编译,或者以其他方式执行预编译阶段而不消耗更多的RAM? 看起来好像这个任务比构建的基线消耗了大约850MB。

背景
我试图得到一个单一的Docker容器Bitbucket流水线版本的我们的自动构建。 应用程序堆栈包括Rails 4.2.7,PostgreSQL 9.3,Java 8,Maven 3.3.9和JRuby 9.1.2.0。 我已经尝试创建基于Debian Jessie和Alpine Linux的映像,但是在基准内存中并没有太大的区别。


digitalocean上最便宜的墨滴也有类似的问题。 我创建了Linux交换分区。 也许你的主要主机没有交换分区。


简短的回答

使用NodeJS作为用于预编译的JavaScript解释器(或者以低峰值RAM使用率为特征的另一个JavaScript解释器)。

较长的答案

对于上下文,我使用NodeJS 4.5.0与therubyracer v0.12.2和therubyrhino v2.0.4

你能增加内存吗?

听起来很愚蠢,但在构建过程复杂化之前,看看是否有更多功能的构建机器可用,或者是否有可用的交换空间(尽管可能会增加构建时间)。

你能切换JavaScript解释器吗?

高峰RAM利用率似乎是therubyrhino (Mozilla的Rhino JavaScript解释器)和therubyracer (V8 JavaScript解释器)的基本特征。 似乎没有一种有效的方式来显着减少资产预编译阶段消耗的内存量。 最可行的路径似乎是在编译生命周期之外对资源进行预编译,并将它们缓存到某个地方,以便可以像@ user4776684所建议的那样获取而不是预编译。 正如对这个问题的评论所表明的那样,Rails版本和Ruby版本都有影响,但是没有JavaScript解释器那么多。

如果一切都失败了

正如上面提到的@ slowjack2k ,如果使用Bundler ,可以利用并行配置来调用NodeJS,仅用于预编译任务,并且保持原始的构建相对不变。 我没有考虑到这一点,因为它更容易切换解释器,但是当我能够用rake和NodeJS预编译资源时,在rake + therubyrhino调用时他们似乎没有被预编译,所以他们是重新预编译。 我用编程方式设置了BUNDLE_GEMFILE环境变量,它指向一个完全独立的gemfile,它使用MRI Ruby和NodeJS代替JRuby和therubyrhino。





bitbucket-pipelines