Rails bundle只安装生产


87

我对Rails / ruby​​ / bundler还是很陌生,有点困惑。

在我们的config/application.rb文件中,有以下捆绑程序段:

if defined?(Bundler)         
  # If you precompile assets before deploying to production, use this line
  Bundler.require(*Rails.groups(:assets => %w(development test)))
  # If you want your assets lazily compiled in production, use this line
  # Bundler.require(:default, :assets, Rails.env)
end

在我们中,Gemfile我们使用不同的组,例如

group :development, :test do
  gem "rspec-rails", ">= 2.7.0", :group => [:development, :test]
  gem 'shoulda-matchers'
  gem 'watchr'
  gem 'spork', '~> 1.0rc'
  gem 'spectator'                          
  gem 'debugger'
  gem 'wirble'
end

但是当我运行RAILS_ENV=production bundle install(或bundle install --deployment)时,它仍然会安装来自开发/测试组的gems。

为什么会发生这种情况,或者如何使它正常工作?

Answers:


181

看一下--without选项:

bundle install --without development test

默认情况下,Bundler安装所有gem,并且您的应用程序使用它所需的gem。Bundler本身对Rails和当前环境一无所知。


2
我知道--without,但是它看起来非常优雅,尤其是考虑其中的配置指令config/application.rb(应该恰好解决了这个问题)并考虑以下引用:Rails 3附带了捆绑器支持。
gingerlime

2
捆绑安装命令完全独立于Rails。它只是查看您的Gemfile,并不关心您的应用程序在上述配置中实际需要的库。实际上,您可以跳过Bundler.require并从任何组手动要求libs。我同意,在这种情况下,Rails可以更好地与Bundler集成,但事实并非如此。
Simon Perepelitsa 2012年

2
我懂了。因此,我想说Rails知道捆绑程序(即inconfig/application.rb和also config/boot.rb)是公平的,但是bundler对rails一无所知...它只读取Gemfile而不使用任何这些rails文件。我认为硬币终于掉了。谢谢你的帮助!
gingerlime 2012年

实际上,这看起来很优雅,因为它排除了Gemfile中的“组”,而不是Rails应用程序中的环境。我知道有人这么说,但是当我这样想的时候,对我来说更有意义。
jaydel

1
不知道这是否在最近四年中发生了变化,但是--without应将参数to与:s而不是空格分开。所以我相信应该是bundle install --without development:test
乔·弗里曼

2

另一种解决方案是使用bundle-only红宝石宝石。可以如下使用:

> gem install bundle-only
> bundle-only production

该库不会污染您的捆绑器配置或扩充Gemfile.lock; 它是提供的内置bundle --without every other group选项的简单替代方案bundler

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.