Tylko instalacja z pakietem szyn

87

Wciąż jestem nowy w rails / ruby ​​/ bundler i jestem trochę zdezorientowany.

W naszym config/application.rbpliku znajduje się ten segment pakietu:

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

aw naszym Gemfileużywamy różnych grup, np

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

Ale kiedy uruchamiam RAILS_ENV=production bundle install(lub bundle install --deployment), nadal instaluje perełki z grupy deweloperskiej / testowej ...

Dlaczego tak się dzieje lub jak mogę to naprawić?

imbir
źródło

Odpowiedzi:

182

Spójrz na --withoutopcję:

bundle install --without development test

Domyślnie Bundler instaluje wszystkie klejnoty, a twoja aplikacja używa klejnotów, których potrzebuje. Sam Bundler nie wie nic o Railsach i aktualnym środowisku.

Simon Perepelitsa
źródło
3
Wiem o tym --without, ale wydaje się to bardzo nieeleganckie, szczególnie biorąc pod uwagę te dyrektywy konfiguracyjne config/application.rb(które mają dokładnie to rozwiązać), a także biorąc pod uwagę następujący cytat: Rails 3 są dostarczane z wypiekanym wsparciem dla bundlera.
gingerlime
2
Polecenie instalacji pakietu jest całkowicie niezależne od Railsów. Po prostu zagląda do twojego Gemfile, nie obchodzi go, jakich bibliotek faktycznie wymaga twoja aplikacja we wspomnianej konfiguracji. W rzeczywistości możesz pominąć Bundler.require i ręcznie wymagać bibliotek z dowolnej grupy. Zgadzam się, że Railsy mogłyby w tym przypadku lepiej zintegrować się z Bundlerem, ale tak się nie dzieje.
Simon Perepelitsa
2
Widzę. Więc myślę, że można uczciwie powiedzieć, że railsy wiedzą o bundlerze (tj. In config/application.rbi także config/boot.rb), ale bundler nie wie nic o railsach ... Czyta tylko plik Gemfile i nie używa żadnego z tych plików rails. Myślę, że moneta w końcu spadła. Dzięki za pomoc!
gingerlime
w rzeczywistości wydaje się to eleganckie, ponieważ wyklucza „grupy” w pliku Gemfile, a nie środowiska w aplikacji Rails. Wiem, że to zostało powiedziane, ale kiedy o tym pomyślałem w ten sposób, nabrało to dla mnie większego sensu.
jaydel
1
Nie jestem pewien, czy to się zmieniło w ciągu ostatnich czterech lat, ale argumenty do --withoutpowinny być oddzielone :s, a nie spacjami. Więc uważam, że tak powinno być bundle install --without development:test.
Joe Freeman
2

Alternatywnym rozwiązaniem jest użycie bundle-onlyrubinowego klejnotu . Można go używać w następujący sposób:

> gem install bundle-only
> bundle-only production

Ta biblioteka nie zanieczyszcza konfiguracji ani rozszerzeń twojego pakietu Gemfile.lock; jest to prosta alternatywa dla wbudowanej bundle --without every other groupopcji, która bundlerzapewnia.

Tom Lord
źródło