Tại sao Rails4 bỏ hỗ trợ cho nhóm "tài sản" trong Gemfile


99

Trong Rails 3, các viên đá quý được sử dụng riêng để tạo tài sản trong đường ống tài sản đã được đặt đúng vào assetsnhóm của Gemfile:

...

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails'
  gem 'coffee-rails'
  gem 'uglifier'

  # See https://github.com/sstephenson/execjs#readme for more supported runtimes
  # gem 'therubyracer', :platforms => :ruby
end

Bây giờ, theo tài liệu nâng cấp (vẫn đang được xử lý) :

Rails 4.0 đã xóa nhóm tài sản khỏi Gemfile. Bạn cần xóa dòng đó khỏi Gemfile của mình khi nâng cấp.

Chắc chắn rồi, việc tạo một dự án mới với RC1 mang lại một Gemfile với các đá quý liên quan đến tài sản được bao gồm bên ngoài bất kỳ nhóm nào theo mặc định:

source 'https://rubygems.org'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.0.0.rc1'

# Use sqlite3 as the database for Active Record
gem 'sqlite3'

# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.0.rc1'

# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'

# Use CoffeeScript for .js.coffee assets and views
gem 'coffee-rails', '~> 4.0.0'

# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby

...

Điều này có nghĩa là những viên ngọc này bây giờ sẽ được đóng gói trong các bản dựng sản xuất theo mặc định? Nếu vậy, tại sao sự thay đổi của trái tim? Rails 4 có đang hướng tới việc tạo ra tài sản năng động trong quá trình sản xuất không?


1
Tôi vẫn không hiểu mục đích của "nhóm tài sản" là gì và những gì đã thay đổi trong Rails 4 khiến nhóm tài sản không cần thiết.
Michiel de Mare

23
"Nhóm tài sản" là những thứ khác nhau đối với những người khác nhau. Tôi đã sử dụng nó như một nơi để đặt những viên đá quý mà tôi không cần đóng gói trong quá trình sản xuất. Nhưng đánh giá từ cuộc trò chuyện được liên kết đến trong câu trả lời được chấp nhận, ít nhất một số người trong lõi rails đã sử dụng nó như một cách để đảm bảo rằng nội dung không được biên dịch trước không thành công với 404 trong quá trình sản xuất (thay vì tự động tạo âm thầm dẫn đến kém hiệu suất). Điều đã thay đổi là rails4 không tự động tạo nội dung nữa, do đó, giải pháp "nhóm nội dung" (như lõi rails đã thấy) đã bị xóa.
jemmons

Đó là lời giải thích rõ ràng nhất. Nếu bạn đặt nó trong một câu trả lời, tiền thưởng là của bạn.
Michiel de Mare

@MichieldeMare Tôi sẽ cảm thấy kỳ lạ khi nhận được tiền thưởng cho câu hỏi của riêng mình ;-) Nếu bạn cảm thấy thích, bạn có thể đưa tiền thưởng cho Filipe Giusti (câu trả lời được chấp nhận) vì anh ấy đã có công giúp tôi hiểu.
jemmons

3
Cảnh báo cho mọi người trong tương lai: Nếu bạn chọn bỏ qua hướng dẫn nâng cấp Rails và giữ nhóm tài sản trong Gemfile của mình, hãy nhớ rằng Rails sẽ không còn tự động yêu cầu nhóm tài sản khi biên dịch tài sản trong sản xuất. Bạn sẽ cần phải tự mình làm điều đó hoặc thêm RAILS_GROUPS=assets(xem Rails.groups) trước lệnh để biên dịch trước các nội dung đang sản xuất trong môi trường xây dựng của bạn.
Ajedi32

Câu trả lời:


100

Trước đây, nhóm tài sản tồn tại để tránh việc tổng hợp theo yêu cầu ngoài ý muốn trong quá trình sản xuất. Vì Rails 4 không hoạt động như vậy nữa, nên việc loại bỏ nhóm nội dung là rất hợp lý.

Điều này được giải thích chi tiết hơn trong cam kết đã thay đổi điều đó. Tôi trích xuất một số trích dẫn với câu trả lời thực tế.

Một số đá quý có thể cần thiết (trong quá trình sản xuất) như đường ray cà phê nếu bạn đang sử dụng các mẫu cà phê và thực tế là bây giờ tài sản không được biên dịch trước theo yêu cầu trong sản xuất nữa.

(không được biên dịch trước theo yêu cầu trong quá trình sản xuất) Có nghĩa là nếu bạn có đá quý đó trong môi trường sản xuất ở 3.2.x và quên biên dịch trước, Rails sẽ thực hiện chính xác những gì nó làm trong quá trình phát triển, biên dịch trước các nội dung được yêu cầu. Điều này không còn đúng trong Rails 4 nữa, vì vậy nếu bạn không biên dịch trước nội dung bằng các tác vụ, bạn sẽ nhận được 404 khi nội dung được yêu cầu.


32
Nó không phải cũng tiết kiệm bộ nhớ? Bây giờ tất cả đá quý, ngay cả những viên không cần thiết trong "sản xuất" (chỉ trong biên dịch trước), được tải và do đó đường ray tiêu thụ nhiều bộ nhớ hơn?
gucki

3
+1 @gucki và thời gian tải. Đây là hiểu biết của tôi về các nhóm .. Vì dù sao cũng đã có tùy chọn cấu hình để tắt biên dịch trực tiếp. Số tiền "hỗ trợ" là gì ở đây. afaik ứng dụng Rails 3 của tôi có một dòng trong env / prod.rb để tải các tài sản đang phát triển. Nếu đó là tất cả, chúng ta có thể chỉ cần thêm nó bằng cách nào?
Karthik T

Nhóm nội dung bị xóa. Trước đó những viên đá quý bên trong tài sản đã được đưa vào sản xuất, bây giờ điều gì sẽ xảy ra nếu chúng ta cũng cần chúng trong quá trình sản xuất. Do đó, chúng nên được tải trong quá trình sản xuất, việc loại bỏ nhóm tài sản đảm bảo điều đó. Nội dung phải được biên dịch trước trước khi chuyển sang sản xuất.
prashantsahni

13

Rails 4 cố gắng buộc bạn phải biên dịch trước nội dung của mình trước khi triển khai. Bạn phải biên dịch trước nội dung của mình với

$ RAILS_ENV=production bundle exec rake assets:precompile

Và tại sao? Tôi tìm thấy điều này trong Hướng dẫn:

Theo mặc định, Rails giả định rằng nội dung đã được biên dịch trước và sẽ được máy chủ web của bạn phân phát dưới dạng nội dung tĩnh.

(Nguồn: http://edgeguides.rubyonrails.org/asset_pipeline.html#in-production )

Nhưng nhiều khi bạn phải sử dụng những viên ngọc 'tài sản' này trong quá trình sản xuất ... ví dụ: nếu bạn sử dụng tệp js.coffee trong thư mục views, thì Rails cũng cần trình biên dịch cà phê ở chế độ sản xuất.

Vì vậy, tôi đoán, lý do của sự thay đổi này là cải thiện hiệu suất ... và trông cũng đơn giản hơn. :)


22
Tay vịn giả định rằng tài sản đã được biên dịch sẵn là một lập luận cho việc giữ các assetsnhóm, không nhận được thoát khỏi nó (nếu tài sản được biên dịch sẵn, sau đó những viên ngọc không cần thiết trong sản xuất và không nên được bao gồm bởi bundler). Và vâng, có thể bạn sẽ sử dụng một viên đá quý như coffee-railstrong sản xuất ... nhưng đó cũng là trường hợp trong Rails 3, phải không? Và Rails 3 đặt coffee-railstrong assetsnhóm, theo mặc định. Vậy tại sao lại có sự thay đổi đối với Rails 4?
jemmons

1
Tại sao bạn lại sử dụng tệp js.coffee trong thư mục chế độ xem của mình? Điều đó sẽ xuất hiện trong nội dung / javascrip.
Marnen Laibow-Koser

3

Chúng tôi muốn coffeescript với AJAX ( history ), vì vậy hãy coffee-railschuyển ra khỏi nhóm tài sản.
sass-railshoạt động sai ( lịch sử ), vì vậy nó di chuyển ra khỏi nhóm nội dung.

Axe nhóm tài sản.


2
CoffeeScript không nên ở trong các khung nhìn. Bạn có thể làm Ajax mà không cần điều đó. Bạn không cần phải tạo động JS để thực hiện Ajax. Trên thực tế, bạn không nên tạo JS động. Biên dịch trước các tệp CoffeeScript của bạn và tránh hoàn toàn sự cố.
Marnen Laibow-Koser

1
sass-rails hoạt động sai vì Bundler.require :assetskhông được chạy. Đó không phải là lý do hợp lý để xóa nhóm nội dung. Tôi không muốn therubyracer, libv8 et c. về sản xuất, tại sao không ai làm? Mẫu cà phê có thể được biên dịch thành mẫu JS và không cần thiết phải biên dịch nó mỗi khi một giá trị mới được thay thế. Không có lý do gì để mang tất cả gánh nặng này vào sản xuất.
phil pirozhkov
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.