由于安装 nokogiri gem (1.6.0( 需要时间,我的生产部署需要额外的几分钟。我知道这是因为安装 gem 会触发本机扩展编译。
请注意,我已经打包了我的捆绑包并将其签入 DVCS
bundle package
如果没有其他更改,有没有办法避免重新编译本机扩展,以便更快地部署?
更新:
我使用 Opscode Chef 进行部署(具体来说就是 chef-solo(
环境是:Ubuntu 12.04LTS 64位红宝石 193-p448
我找到了一种方法来做到这一点。解释如下:
默认情况下,捆绑器将 gem 安装到环境变量 BUNDLE_PATH
指向的文件夹中。BUNDLE_PATH
的默认值为 vendor/bundle
。因此,所有 gem 都安装在/vendor/bundle
文件夹中,该文件夹恰好是一个私有文件夹(对于每个版本的 Rails 应用程序(。安装新版本的 Rails 应用程序时,vendor/bundle
不存在。因此,捆绑器安装/预编译每个 gem。它从vendor/cache
中获取宝石,这比从rubygems.org
下载宝石是一个很好的节省,但它仍然无法避免编译本机扩展。
我们可以通过将--path /shared/path
传递给bundle install
命令行来覆盖它。这将确保 gem 始终安装在 /shared/path
中,所有版本(Rails 应用程序的(都可以访问该版本。
使用这种方法,bundler 不会尝试重新安装/重新编译 gem,因为它会发现已安装的相同内容。
所以,这是对我有用的魔法命令
bundle install --local --deployment --path /shared/bundle --without development test