2010-12-14 9 views
22

Ho una piccola app Web che utilizza un mucchio di gemme. Alcuni di questi sono utilizzati solo per gli ambienti test e development. Ora, quando provo ad avviare unicorno sul server di produzione usando il seguente comando, fallisce.bundler che tenta erroneamente di installare "sviluppo" e "prova" gemme di gruppo nella produzione

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

L'errore che vedo nei file di log è:

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`. 

Ho incollato il mio Gemfile di seguito:

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 dovrebbe rilevare il giusto ambiente e ignorare la altre gemme, giusto? In questo momento, sto cancellando tutte le righe che non sono nel gruppo predefinito sul server per farlo funzionare, ma questo è un brutto scherzo.

+0

Capistrano nella produzione non sembra giusto? –

risposta

52

Dopo un sacco di scavare ho trovato la correzione di questo problema. Tutto quello che dovevo fare era eseguire bundle install --without development test prima di avviare il server. Questo aggiunge un file .bundle/config nella radice dei binari con la riga BUNDLE_WITHOUT: test:development. Ora ogni volta che si esegue bundle install o si avvia il server, ignorerà quei gruppi.

From the documentation

Bundler CLI permette di specificare un elenco di gruppi le cui gemme impacchettare installare non dovrebbe installazione con l'opzione --without . Per specificare più gruppi da ignorare, specificare un elenco di gruppi separati da spazi.

bundle install prova --without fascio installare --without test di sviluppo Dopo aver eseguito bundle install --without prova, bundler ricorderà che si escluso il gruppo di prova nell'ultima installazione. La prossima volta che esegui l'installazione di bundle , senza alcuna opzione - senza l'opzione , il pacchetto verrà richiamata da bundler.

Inoltre, chiamando Bundler.setup senza parametri, o chiamando richiede "bundler/setup" predisporrà tutti i gruppi eccezione per quelli che escluso tramite --without (dal momento che non sono ovviamente disponibili).

+0

Questa è stata una bella risposta! –

+0

Grazie! Stavo cercando la sintassi per il file di configurazione :) BUNDLE_WITHOUT: test: sviluppo – Nultyi

+2

Penso che questo sia solo un cattivo design. Perché non ignorare qualcosa di non-dev di default? Non dovresti raggruppare nel gemfile ed escludere tramite la riga di comando. Dovrebbe essere predefinito per l'ambiente di sviluppo e quindi includere produzione o test. Altrimenti c'è molta ridondanza e mal di testa durante lo sviluppo. – PhillipKregg

-2

Non è stato definito un gruppo di produzione =)

+0

quindi, se ho un gruppo "produzione" vuoto, funzionerà? –

+0

Boh, potresti provare; p Vedi se chiede ancora la gemma spork. – Icid

+0

Purtroppo non si sa molto dei test (o.O) – Icid

4

Nel mio caso era l'installazione di gemme da jenkins env. Quindi ho dovuto impostare la mia variabile bundle_without a capistrano.

Gemfile

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

deploy.rb

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