Bundler在生产环境下错误地尝试安装“开发”和“测试”组的gem。

28

我有一个小型Web应用程序,使用了许多gem。其中一些仅在测试开发环境中使用。现在,当我尝试使用以下命令在生产服务器上启动独角兽时,它会失败。

unicorn_rails -E production -D -c config/unicorn.rb

我在日志文件中看到的错误是:

Refreshing Gem list
Could not find gem 'spork (>= 0.9.0.rc2, runtime)' in any of the gem sources listed in your Gemfile.
Try running `bundle install`.

下面是我的Gemfile内容:

source 'http://rubygems.org'

gem 'rails', '3.0.1'
gem 'unicorn'
gem 'mongoid', '>= 2.0.0.beta.19'
gem 'devise'
gem 'cancan'
gem 'haml', '>= 3.0.0'
gem 'bson'
gem 'bson_ext'
gem 'formtastic'
gem 'bluecloth'

group :production do
  gem 'capistrano'
end

group :development do
  gem 'haml-rails'
  gem 'hpricot', '0.8.2'
  gem 'ruby_parser', '2.0.5'
  gem 'less'
  gem 'rspec-rails', '>= 2.0.1'
end

group :development,:test do
  gem 'spork', '>=0.9.0.rc2'
  gem 'mongoid-rspec'
end

group :test do
  gem 'factory_girl_rails'
  gem 'autotest'
  gem 'cucumber-rails'
  gem 'cucumber'
  gem 'capybara'
  gem 'shoulda'
  gem 'database_cleaner'
  gem 'test_notifier'
  gem 'rspec', '2.0.1'
  gem 'launchy' 
end

Bundler应该能够检测正确的环境并忽略其他gem,对吗?现在,为了使其工作,我正在删除服务器上不属于默认组的所有行,但那很丑陋。


1
Capistrano 在生产环境中似乎不太合适? - Koen.
3个回答

59
经过大量的搜索,我找到了解决此问题的方法。 我只需要在启动服务器之前运行 bundle install --without development test 即可解决问题。 这将在 rails 根目录下添加一个 .bundle/config 文件,并加入以下一行代码: BUNDLE_WITHOUT: test:development。 现在无论何时运行 bundle install 或启动服务器,都会忽略这些组。
参考文献:官方文档 Bundler CLI 允许您使用 --without 选项指定不应与 gem 组捆绑安装的组的列表。 要忽略多个组,请在空格分隔的组列表中指定。例如:bundle install --without test bundle install --without development test。 运行 bundle install --without test 后,Bundler 将记住您在上次安装中排除了测试组。 下次运行 bundle install 时,如果没有任何 --without 选项,Bundler 将自动排除测试组。
另外,调用 Bundler.setup 没有参数或调用 require "bundler/setup" 将设置除通过 --without 排除的组之外的所有组(因为它们显然不可用)。

谢谢!我在寻找配置文件的语法 :) BUNDLE_WITHOUT: test:development - iNulty
2
我认为这只是糟糕的设计。为什么不默认忽略任何非开发相关内容?你不应该通过分组在gemfile中并通过命令行排除来实现。它应该默认为开发环境,然后您可以包括生产或测试环境。否则,在开发过程中会出现很多冗余和头疼的问题。 - PhillipKregg
@PhillipKregg Bundler没有将“dev环境”作为与gem组不同的概念。Rails有这个概念,但Bundler不应该将其安装行为与另一个gem的内部耦合(并非每个项目都使用Rails)。 - Marnen Laibow-Koser
今天我学到了。 - Jared Menard

4
在我的情况下,是从Jenkins env安装gems。因此,我必须在capistrano中设置自己的bundle_without变量。
Gemfile
group :test, :development, :jenkins do  
  gem 'test-unit', '1.2.3'  
  gem 'rspec-rails'
end

deploy.rb

set :bundle_without, [:development, :test, :jenkins]

-2

您还没有定义生产组 =)


不知道,你可以试试;p 看看它是否仍然要求 spork gem。 - Icid
刚刚尝试了一下包含 Capistrano 的生产环境组,仍然抛出相同的错误 :( - Khaja Minhajuddin
你确定在spec_helper中设置了正确的环境吗?请检查此链接:http://railstutorial.org/chapters/static-pages#sec:spork - Icid
生产组不应该拥有在production中需要的宝石,而是不应该加载的宝石,对吗? - Khaja Minhajuddin
确实。在你的应用程序中,'hpricot'有什么作用? - Icid
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接