2010-12-14 58 views
22

我有一个小型的网络应用程序,它使用了一堆宝石。其中一些仅用于testdevelopment环境。现在,当我尝试使用以下命令在生产服务器上启动独角兽时,它失败。bundler错误地试图在生产中安装“开发”和“测试”组宝石

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 

捆绑器应该检测合适的环境,而忽略其他宝石,对吧?现在,我删除了所有不在服务器上的默认组中的行,以使其正常工作,但这是一个丑陋的黑客行为。

+0

Capistrano的生产似乎deploy.rb不正确的? – 2013-05-30 08:52:05

回答

52

经过大量挖我发现这个问题的修补程序。我只需要在启动服务器之前运行bundle install --without development test。这会在rails根目录中添加一个.bundle/config文件与BUNDLE_WITHOUT: test:development行。现在,无论何时运行bundle install或启动服务器,它都会忽略这些组。

From the documentation

所述捆绑CLI允许您指定 其宝石捆绑 安装不应与 --without选项安装组的列表。要指定多个要忽略的组,请指定由空格分隔的 组列表。

捆绑安装--without测试包 安装--without开发测试 运行捆绑安装--without 测试后,捆绑会记得你 排除测试组中最后一个 安装。下次运行 软件包安装时,如果没有任何 - 没有 选项,bundler会记住它。

此外,调用Bundler.setup没有 参数,或调用需要 “打捆/设置”将设置所有组 除了你通过 --without排除那些(因为他们显然不适用)。

+0

这是一个很好的答案! – 2013-01-16 20:56:58

+0

谢谢!正在寻找配置文件的语法:) BUNDLE_WITHOUT:test:development – Nultyi 2014-01-03 09:57:14

+2

我认为这只是糟糕的设计。为什么不默认忽略任何非开发?您不必在gemfile中进行分组,并通过命令行进行排除。它应该默认为开发环境,然后包括生产或测试。否则在开发过程中会造成很多冗余和麻烦。 – PhillipKregg 2014-09-27 21:28:37

-2

您还没有定义的制作组=)

+0

因此,如果我有一个空的“生产”组,它会起作用吗? – 2010-12-14 11:36:48

+0

不知道,你可以试试; p看看它是否仍然问spork宝石。 – Icid 2010-12-14 11:41:02

+0

不知道那么多关于测试不幸(o。O) – Icid 2010-12-14 11:45:46

4

在我的情况下,它是从詹金斯env安装宝石。所以我不得不在capistrano中设置自己的bundle_without变量。

的Gemfile

group :test, :development, :jenkins do 
    gem 'test-unit', '1.2.3' 
    gem 'rspec-rails' 
end 

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