Rails4, Gemfile'daki "varlıklar" grubu desteğini neden düşürdü?


99

Rails 3'te, varlık hattında varlık oluşturmak için özel olarak kullanılan mücevherler assets, Gemfile grubuna uygun şekilde yerleştirildi :

...

# 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

Şimdi, (halen devam eden) yükseltme belgelerine göre :

Rails 4.0, varlık grubunu Gemfile'dan kaldırdı. Yükseltme yaparken bu satırı Gemfile'ınızdan kaldırmanız gerekir.

Yeterince kesin, RC1 ile yeni bir proje yapmak, varsayılan olarak herhangi bir grubun dışında bulunan varlıkla ilgili mücevherler içeren bir Gemfile sağlar:

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

...

Bu, bu mücevherlerin artık varsayılan olarak üretim yapılarında paketleneceği anlamına mı geliyor? Öyleyse, neden fikir değişiyor? Rails 4, üretimde dinamik varlık nesline doğru mu gidiyor?


1
"Varlık grubunun" amacının ne olduğunu ve varlık grubunu gereksiz kılan Rails 4'te neyin değiştiğini hala anlamıyorum.
Michiel de Mare

23
"Varlık grubu" farklı insanlar için farklı şeylerdi. Üretimde ihtiyaç duymadığım mücevherleri koymak için bir yer olarak kullandım. Ancak, kabul edilen yanıtla bağlantılı konuşmaya bakılırsa, en azından rayların çekirdeğindeki bazı kişiler, bunu, önceden derlenmemiş varlıkların üretimde bir 404 ile başarısız olduğundan emin olmanın bir yolu olarak kullandı (sessizce otomatik oluşturma yerine, bu da fakirlere yol açar verim). Değişen şey, rails4'ün artık varlıkları otomatik olarak oluşturmamasıdır, bu nedenle "varlık grubu" geçici çözümü (rayların çekirdeğinin gördüğü gibi) kaldırılmıştır.
jemmons

Bu şimdiye kadarki en net açıklama. Cevabını verirsen, ödül senindir.
Michiel de Mare

@MichieldeMare Kendi sorum için bir ödül almak kendimi garip hissederim ;-) Eğer istersen, ödülünü Filipe Giusti'ye verebilirsin (kabul edilen cevap) çünkü o anlamama yardımcı oldu.
jemmons

3
Gelecekteki insanlara bir uyarı: Rails yükseltme kılavuzunu yok saymayı ve varlık grubunu Gemfile'da tutmayı seçerseniz, Rails'in artık varlıkları üretimde derlerken otomatik olarak varlık grubuna ihtiyaç duymayacağını unutmayın. Bunu kendiniz yapmanız veya oluşturma ortamınızdaki üretimde varlıkları önceden derleme komutunun önüne eklemeniz RAILS_GROUPS=assets(bakın Rails.groups) gerekir.
Ajedi32

Yanıtlar:


100

Daha önce, üretimde istenmeyen talebe göre derlemeden kaçınmak için varlıklar grubu vardı. Rails 4 artık böyle davranmadığı için, varlık grubunu kaldırmak mantıklıydı.

Bu, onu değiştiren commit'de daha ayrıntılı olarak açıklanmıştır . Gerçek cevapla bazı alıntılar çıkardım.

Kahve şablonları kullanıyorsanız ve artık üretimde talep üzerine varlıkların önceden derlenmediği gerçeği, kahve rayları gibi (üretimde) bazı mücevherlere ihtiyaç duyulabilir.

(üretimde talep üzerine önceden derlenmemiş) 3.2.x'teki üretim ortamında o mücevherlere sahipseniz ve ön derlemeyi unutursanız, Rails'in geliştirmede tam olarak yaptığı şeyi yapacağı, talep edilen varlıkları önceden derleyeceği anlamına gelir. Bu artık Rails 4'te geçerli değil, bu nedenle varlıkları görevleri kullanarak önceden derlemezseniz, varlıklar istendiğinde bir 404 alacaksınız.


32
Hafızayı da kurtarmıyor muydu? Şimdi tüm mücevherler, "üretimde" (sadece ön derlemede) gerekmeyenler bile yüklenir ve bu nedenle raylar daha fazla bellek tüketir mi?
gucki

3
+1 @gucki ve yükleme süresi. Gruplar hakkındaki anlayışım buydu .. Zaten canlı derlemeyi devre dışı bırakmak için bir yapılandırma seçeneği zaten vardı. Burada "destek" ne anlama geliyor? afaik my Rails 3 uygulamasının env / prod.rb dosyasında varlıkları yalnızca geliştirme aşamasında yükleyen bir satırı vardı. Hepsi buysa, yine de ekleyebilir miyiz?
Karthik T

Varlıklar grubu kaldırılır. Daha önce varlıkların içindeki mücevherler üretime yüklendi, şimdi de üretimde onlara ihtiyacımız olursa. Dolayısıyla üretimde yük olmalı, varlık grubunun kaldırılması bunu sağlar. Varlıklar üretime geçmeden önce önceden derlenmelidir.
prashantsahni

13

Rails 4, dağıtımdan önce sizi varlıklarınızı önceden derlemeye zorlar. Varlıklarınızı önceden derlemelisiniz

$ RAILS_ENV=production bundle exec rake assets:precompile

Ve neden? Bunu Kılavuzda buldum:

Varsayılan olarak Rails, varlıkların önceden derlendiğini ve web sunucunuz tarafından statik varlıklar olarak sunulacağını varsayar.

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

Ancak çoğu zaman bu 'varlıklar' mücevherlerini üretimde kullanmanız gerekir ... örneğin, görünümler dizininizde bir js.coffee dosyası kullanıyorsanız, o zaman Rails'in de üretim modunda kahve derleyicisine ihtiyacı vardır.

Bu yüzden sanırım, bu değişikliğin sebebi performans artışı ... ve daha basit görünüyor. :)


22
Varlıkların önceden derlendiğini varsayan raylar , grubu korumak için bir argümandır assets, ondan kurtulmak değildir (varlıklar önceden derlenmişse, bu taşlar üretimde gerekli değildir ve paketleyici tarafından dahil edilmemelidir). Ve evet, belki coffee-railsüretimde olduğu gibi bir mücevher kullanırsınız ... ama Rails 3'te de durum böyleydi, değil mi? Ve 3 put Raylar coffee-railsiçinde assetsvarsayılan olarak, grubun. Peki neden Rails 4 için değişiklik oldu?
jemmons

1
Görünümler dizininizde neden js.coffee dosyası kullanasınız? Bu, varlıklara / javascriptlere gitmelidir.
Marnen Laibow-Koser

3

AJAX ( geçmiş ) içeren kahve dosyası istiyoruz , bu nedenle coffee-railsvarlıklar grubundan çıkar.
sass-railsyanlış davranışlar ( tarih ), dolayısıyla varlıklar grubundan çıkar.

Varlıklar grubunu baltalayın.


2
CoffeeScript, görünümlerde olmamalıdır. Ajax'ı o olmadan da yapabilirsiniz. Ajax yapmak için dinamik olarak JS oluşturmanıza gerek yoktur. Aslında, dinamik olarak JS oluşturmamalısınız. CoffeeScript dosyalarınızı önceden derleyin ve sorunu tamamen önleyin.
Marnen Laibow-Koser

1
sass-rails yanlış davranıyor çünkü Bundler.require :assetsçalıştırılmıyor. Bu, varlık grubunu kaldırmak için bir mantık değildir. Therubyracer, libv8 ve c istemiyorum. üretim üzerine, neden kimse yapıyor? Kahve şablonu bir JS şablonuna derlenebilir ve her yeni değer değiştirildiğinde onu derlemenin bir anlamı yoktur. Tüm bu yükü üretime almanın bir anlamı yok.
phil pirozhkov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.