ruby - 在随后的 bundle 安装中跳过 native 扩展重新编译

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

由于安装 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/

相关文章:

ruby-on-rails - 如何查看日历邀请邮件中的 ics 文件?

ruby-on-rails - Ruby on Rails - 名称错误 : uninitialized constant UsersController at/admin/users

ruby - for循环的用法?

ruby - 如何合并 Ruby 哈希

ruby-on-rails - Rails bootstrap-sass 重新定义/重载 mixins

ruby - bundler 、rubygems 和动态使用 gems

ruby - 混帐,Heroku : pre-receive hook declined

ruby-on-rails - rails 上的下一个对象问题

ruby - 如何使用 Ruby-Rails 删除文件夹的所有内容?

ruby - 'pathutil' ruby​​ gem 是否与 jekyll (v3.9.0) 和 ruby​​ (v3.0.0) 兼容?