由于安装 nokogiri gem (1.6.0) 需要时间,我的生产部署需要额外几分钟。我知道这是因为安装 gem 会触发 native 扩展编译。
请注意,我已经打包我的包并将其 checkin DVCS
bundle package
如果没有其他任何变化,是否有一种方法可以避免重新编译 native 扩展,从而加快部署速度?
更新:
我使用 Opscode Chef 进行部署(具体来说是 chef-solo)
环境是: Ubuntu 12.04LTS 64 位 ruby 193-p448
最佳答案
我找到了一种方法来做到这一点。解释如下:
Bundler,默认情况下将 gems 安装到环境变量 BUNDLE_PATH
指向的文件夹中。 BUNDLE_PATH
的默认值为 vendor/bundle
。因此所有的 gem 都安装在 /vendor/bundle
文件夹中,它恰好是一个私有(private)文件夹(对于每个版本的 Rails 应用程序)。安装新版本的 Rails 应用程序时,vendor/bundle
不存在。因此 Bundler 安装/预编译每个 gem。它从 vendor/cache
中获取 gem,这比从 rubygems.org
下载 gem 节省了很多,但它仍然无法避免编译 native 扩展。
我们可以通过将 --path/shared/path
传递给 bundle install
命令行来覆盖它。这将确保 gem 始终安装在 /shared/path
中,所有版本(Rails 应用程序的)都可以访问它。
使用这种方法,bundler 将不会尝试重新安装/重新编译 gem,因为它发现已经安装了相同的 gem。
所以,这是对我有用的神奇命令
bundle install --local --deployment --path /shared/bundle --without development test
关于ruby - 在随后的 bundle 安装中跳过 native 扩展重新编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18402264/