Mengapa Rails4 melepaskan dukungan untuk grup "aset" di Gemfile

99

Di Rails 3, permata yang digunakan secara eksklusif untuk menghasilkan aset dalam pipa aset ditempatkan dengan benar di assetsgrup 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

Sekarang, menurut dokumentasi peningkatan (masih dalam proses) :

Rails 4.0 menghapus grup aset dari Gemfile. Anda harus menghapus baris itu dari Gemfile Anda saat meningkatkan.

Benar saja, membuat proyek baru dengan RC1 menghasilkan Gemfile dengan permata terkait aset yang disertakan secara default di luar grup mana pun:

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

...

Apakah ini berarti permata ini sekarang akan dibundel dalam build produksi secara default? Jika demikian, mengapa berubah hati? Apakah Rails 4 bergerak menuju pembuatan aset yang dinamis dalam produksi?

jemmons
sumber
1
Saya masih tidak mengerti apa tujuan dari "grup aset" itu, dan apa yang berubah di Rails 4 yang membuat grup aset tidak diperlukan.
Michiel de Mare
23
"Kelompok aset" adalah hal yang berbeda bagi orang yang berbeda. Saya menggunakannya sebagai tempat menaruh permata yang tidak saya butuhkan dalam bundel produksi. Tetapi menilai dari percakapan yang terkait dengan jawaban yang diterima, setidaknya beberapa orang di inti rel menggunakannya sebagai cara untuk memastikan bahwa aset yang tidak dikompilasi gagal dengan 404 dalam produksi (alih-alih menghasilkan otomatis secara diam-diam yang akan menyebabkan miskin kinerja). Apa yang berubah adalah rails4 tidak lagi menghasilkan aset secara otomatis, sehingga solusi "grup aset" (seperti yang dilihat oleh inti rails) telah dihapus.
jemmons
Itu penjelasan yang paling jelas. Jika Anda memasukkannya ke dalam sebuah jawaban, hadiah itu menjadi milik Anda.
Michiel de Mare
@MichieldeMare Saya merasa aneh mendapatkan hadiah untuk pertanyaan saya sendiri ;-) Jika Anda ingin, Anda dapat memberikan hadiah tersebut kepada Filipe Giusti (jawaban yang diterima) karena dia berperan penting dalam membantu saya memahami.
jemmons
3
Peringatan untuk orang-orang di masa depan: Jika Anda memilih untuk mengabaikan panduan peningkatan Rails dan menyimpan grup aset di Gemfile Anda, perlu diingat bahwa Rails tidak lagi secara otomatis memerlukan grup aset saat menyusun aset dalam produksi. Anda harus melakukannya sendiri, atau menambahkan RAILS_GROUPS=assets(lihat Rails.groups) sebelum perintah untuk memprakompilasi aset dalam produksi di lingkungan build Anda.
Ajedi32

Jawaban:

100

Sebelumnya, grup aset ada untuk menghindari kompilasi sesuai permintaan yang tidak diinginkan dalam produksi. Karena Rails 4 tidak berperilaku seperti itu lagi, masuk akal untuk menghapus grup aset.

Ini dijelaskan lebih detail dalam komit yang mengubahnya. Saya mengekstrak beberapa kutipan dengan jawaban sebenarnya.

Beberapa permata dapat dibutuhkan (dalam produksi) seperti rel kopi jika Anda menggunakan templat kopi dan fakta bahwa sekarang aset tidak dikompilasi sesuai permintaan dalam produksi lagi.

(tidak dikompilasi sesuai permintaan dalam produksi) Berarti jika Anda memiliki permata tersebut di lingkungan produksi di 3.2.x dan lupa melakukan prakompilasi, Rails akan melakukan persis seperti yang dilakukannya dalam pengembangan, mengompilasi aset yang diminta. Ini tidak berlaku lagi di Rails 4, jadi jika Anda tidak melakukan prakompilasi aset menggunakan tugas, Anda akan mendapatkan 404 saat aset diminta.

Filipe Giusti
sumber
32
Bukankah itu juga menghemat memori? Sekarang semua permata, bahkan yang tidak diperlukan dalam "produksi" (hanya dalam prakompilasi), dimuat dan dengan demikian rel menghabiskan lebih banyak memori?
gucki
3
+1 @gucki dan waktu buka. Ini adalah pemahaman saya tentang grup .. Karena sudah ada opsi konfigurasi untuk menonaktifkan kompilasi langsung. Apa arti "dukungan" di sini. afaik aplikasi Rails 3 saya memiliki baris di env / prod.rb yang memuat aset baru saja dalam pengembangan. Jika hanya itu, bisakah kita menambahkannya saja?
Karthik T
Grup aset dihapus. Sebelumnya permata di dalam aset dimuat ke produksi, sekarang bagaimana jika kita juga membutuhkannya dalam produksi. Oleh karena itu mereka harus dimuat dalam produksi, penghapusan kelompok aset memastikan itu. Aset harus dikompilasi terlebih dahulu sebelum dipindahkan ke produksi.
prashantsahni
13

Rails 4 mencoba memaksa Anda untuk mengkompilasi aset Anda sebelum penyebaran. Anda harus melakukan prakompilasi aset Anda dengan

$ RAILS_ENV=production bundle exec rake assets:precompile

Dan mengapa? Saya menemukan ini di Panduan:

Secara default, Rails mengasumsikan bahwa aset telah dikompilasi sebelumnya dan akan disajikan sebagai aset statis oleh server web Anda.

(Sumber: http://edgeguides.rubyonrails.org/asset_pipeline.html#in-production )

Tetapi seringkali Anda harus menggunakan permata 'aset' ini dalam produksi ... misalnya, jika Anda menggunakan file js.coffee di direktori views Anda, maka Rails juga memerlukan kompiler kopi dalam mode produksi.

Jadi saya rasa, alasan dari perubahan ini adalah peningkatan performa ... dan terlihat lebih sederhana juga. :)

Zoltan
sumber
22
Rel dengan asumsi bahwa aset telah dikompilasi adalah argumen untuk menjaga para assetskelompok, tidak mendapatkan menyingkirkan itu (jika aset tersebut dikompilasi, maka permata ini tidak diperlukan dalam produksi dan seharusnya tidak dimasukkan oleh bundler). Dan ya, mungkin Anda akan menggunakan permata seperti coffee-railsdalam produksi ... tapi itu juga terjadi di Rails 3, bukan? Dan Rails 3 dimasukkan ke coffee-railsdalam assetsgrup, secara default. Jadi mengapa perubahan untuk Rails 4?
jemmons
1
Mengapa Anda menggunakan file js.coffee di direktori views Anda? Itu harus masuk ke dalam assets / javascripts.
Marnen Laibow-Koser
3

Kami ingin coffeescript dengan AJAX ( sejarah ), jadi coffee-railskeluar dari grup aset.
sass-railsberperilaku buruk ( riwayat ), sehingga keluar dari grup aset.

Kapak grup aset.

mockturtl
sumber
2
CoffeeScript seharusnya tidak dalam tampilan. Anda dapat melakukan Ajax tanpa itu. Anda tidak perlu membuat JS secara dinamis untuk melakukan Ajax. Faktanya, Anda tidak boleh membuat JS secara dinamis. Pra-kompilasi file CoffeeScript Anda dan hindari masalah sepenuhnya.
Marnen Laibow-Koser
1
sass-rails berperilaku buruk karena Bundler.require :assetstidak dijalankan. Itu bukan alasan untuk menghapus grup aset. Saya tidak ingin therubyracer, libv8 et c. pada produksi, mengapa ada yang melakukannya? Template kopi dapat dikompilasi ke template JS, dan tidak ada gunanya mengkompilasinya setiap kali nilai baru diganti. Tidak ada gunanya mengambil semua beban ini untuk produksi.
phil pirozhkov