Chỉ sản xuất gói cài đặt Rails


87

Tôi vẫn chưa quen với rails / ruby ​​/ bundler và hơi bối rối.

Trong config/application.rbtệp của chúng tôi có phân đoạn trình gói này:

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

và trong chúng Gemfiletôi, chúng tôi sử dụng các nhóm khác nhau, ví dụ:

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

Nhưng khi tôi chạy RAILS_ENV=production bundle install(hoặc bundle install --deployment), nó vẫn cài đặt các viên ngọc từ nhóm phát triển / thử nghiệm ...

Tại sao điều này xảy ra hoặc làm thế nào để tôi có thể làm cho việc này hoạt động bình thường?

Câu trả lời:


181

Hãy xem --withouttùy chọn:

bundle install --without development test

Theo mặc định, Bundler cài đặt tất cả đá quý và ứng dụng của bạn sử dụng đá quý mà nó cần. Bản thân Bundler không biết gì về Rails và môi trường hiện tại.


3
Tôi biết về --withoutnó, nhưng nó có vẻ rất thanh lịch, đặc biệt là xem xét các chỉ thị cấu hình trong config/application.rb(được cho là giải quyết chính xác vấn đề này) và cũng xem xét trích dẫn này: Rails 3 đi kèm với hỗ trợ với Bundler.
Gingerlime

2
Lệnh cài đặt gói hoàn toàn độc lập với Rails. Nó chỉ xem xét Gemfile của bạn, nó không quan tâm đến những thư viện mà ứng dụng của bạn thực sự yêu cầu trong cấu hình được đề cập. Trên thực tế, bạn có thể bỏ qua Bundler.require và yêu cầu libs theo cách thủ công từ bất kỳ nhóm nào. Tôi đồng ý rằng Rails có thể tích hợp tốt hơn trong trường hợp này với Bundler, nhưng không.
Simon Perepelitsa

2
Tôi hiểu rồi. Vì vậy, tôi đoán thật công bằng khi nói rằng rails biết về Bundler (tức là trong config/application.rbvà ngoài ra config/boot.rb), nhưng Bundler không biết gì về rails ... Nó chỉ đọc Gemfile và không sử dụng bất kỳ tệp rails nào. Tôi nghĩ rằng đồng xu cuối cùng đã giảm xuống. Cảm ơn bạn đã giúp đỡ!
Gingerlime

thực sự điều này có vẻ thanh lịch vì nó loại trừ 'nhóm' trong Gemfile của bạn, không phải môi trường trong ứng dụng Rails của bạn. Tôi biết điều này đã được nói ra nhưng khi tôi nghĩ về nó theo cách này, nó có ý nghĩa hơn đối với tôi.
jaydel

1
Không chắc liệu đây có phải là điều gì đó đã thay đổi trong bốn năm qua hay không, nhưng các đối số --withoutđược cho là được phân tách bằng :s chứ không phải dấu cách. Vì vậy, tôi tin rằng nó nên được bundle install --without development:test.
Joe Freeman

2

Một giải pháp thay thế là sử dụng bundle-onlyđá quý ruby . Nó có thể được sử dụng như sau:

> gem install bundle-only
> bundle-only production

Thư viện này không gây ô nhiễm cho cấu hình hoặc phần bổ sung của trình gói của bạn Gemfile.lock; nó là một thay thế đơn giản cho bundle --without every other grouptùy chọn tích hợp sẵn bundlercung cấp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.