在后续的bundle安装上跳过本机扩展重新编译

时间:2013-08-23 11:57:22

标签: ruby ruby-on-rails-3 rubygems bundler nokogiri

由于安装nokogiri gem(1.6.0)所需的时间,我的生产部署需要额外的几分钟。我理解这是因为安装gem会触发本机扩展编译。

请注意,我已打包我的包并将其检入DVCS

bundle package

如果没有其他更改,是否有办法避免重新编译本机扩展,以便部署更快?

更新

我使用Opscode Chef进行部署(chef-solo具体)

环境是: Ubuntu 12.04LTS 64位 Ruby 193-p448

1 个答案:

答案 0 :(得分:4)

我找到了一种方法来做到这一点。以下是解释:

Bundler默认情况下将gem安装到环境变量BUNDLE_PATH指向的文件夹中。 BUNDLE_PATH的默认值为vendor/bundle。因此,所有宝石都安装在/vendor/bundle文件夹中,该文件夹恰好是一个私人文件夹(对于每个版本的Rails应用程序)。安装新版本的Rails应用程序时,vendor/bundle不存在。因此Bundler安装/预编译每个gem。它从vendor/cache中获取宝石,这比从rubygems.org下载宝石更好,但它仍然无法避免编译原生扩展。

我们可以通过将--path /shared/path传递给bundle install命令行来覆盖它。这将确保gems始终安装在/shared/path中,所有版本(Rails应用程序)都可以访问。

使用这种方法,bundler不会尝试重新安装/重新编译gem,因为它找到了已安装的gem。

所以,这是对我有用的神奇命令

bundle install --local --deployment --path /shared/bundle --without development test