เหตุใด Rails4 จึงยกเลิกการรองรับกลุ่ม "ทรัพย์สิน" ใน Gemfile


99

ใน Rails 3 อัญมณีที่ใช้เฉพาะในการสร้างสินทรัพย์ในไปป์ไลน์สินทรัพย์ถูกวางไว้อย่างถูกต้องในassetsกลุ่มของ 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

ตอนนี้ตามเอกสารการอัพเกรด (ยังอยู่ระหว่างดำเนินการ) :

Rails 4.0 ลบกลุ่มสินทรัพย์ออกจาก Gemfile คุณจะต้องลบบรรทัดนั้นออกจาก Gemfile ของคุณเมื่อทำการอัพเกรด

แน่นอนว่าการสร้างโปรเจ็กต์ใหม่ด้วย RC1 จะให้ Gemfile พร้อมกับอัญมณีที่เกี่ยวข้องกับสินทรัพย์โดยค่าเริ่มต้นนอกกลุ่มใด ๆ :

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

...

หมายความว่าตอนนี้อัญมณีเหล่านี้จะรวมอยู่ในงานสร้างตามค่าเริ่มต้นหรือไม่? ถ้าเป็นเช่นนั้นทำไมหัวใจถึงเปลี่ยนไป? Rails 4 กำลังก้าวไปสู่การสร้างสินทรัพย์แบบไดนามิกในการผลิตหรือไม่?


1
ฉันยังไม่เข้าใจจุดประสงค์ของ "กลุ่มเนื้อหา" และสิ่งที่เปลี่ยนแปลงใน Rails 4 ที่ทำให้กลุ่มเนื้อหาไม่จำเป็น
Michiel de Mare

23
"กลุ่มเนื้อหา" เป็นคนละสิ่งกับคนอื่น ฉันใช้ที่นี่เป็นที่ใส่อัญมณีที่ไม่จำเป็นต้องรวมในการผลิต แต่เมื่อพิจารณาจากบทสนทนาที่เชื่อมโยงกับในคำตอบที่ยอมรับอย่างน้อยก็มีบางคนที่อยู่ในแกนกลางของรางใช้เป็นวิธีตรวจสอบให้แน่ใจว่าสินทรัพย์ที่ไม่ได้ทำการคอมไพล์ล้มเหลวด้วย 404 ในการผลิต (แทนที่จะสร้างโดยอัตโนมัติแบบเงียบ ๆ ซึ่งจะทำให้ไม่ดี ประสิทธิภาพ). สิ่งที่เปลี่ยนไปคือ rail4 ไม่สร้างเนื้อหาโดยอัตโนมัติอีกต่อไปดังนั้นวิธีแก้ปัญหา "กลุ่มสินทรัพย์" (ตามที่เห็นแกนราง) จึงถูกลบออก
jemmons

นั่นเป็นคำอธิบายที่ชัดเจนที่สุด หากคุณใส่คำตอบรางวัลก็เป็นของคุณ
Michiel de Mare

@MichieldeMare ฉันรู้สึกแปลก ๆ ที่ได้รับรางวัลสำหรับคำถามของฉันเอง ;-) ถ้าคุณรู้สึกเช่นนั้นคุณสามารถให้รางวัลแก่ Filipe Giusti (คำตอบที่ได้รับการยอมรับ) ในขณะที่เขาเป็นเครื่องมือในการช่วยให้ฉันเข้าใจ
jemmons

3
คำเตือนสำหรับผู้คนในอนาคต: หากคุณเลือกที่จะเพิกเฉยต่อคู่มือการอัปเกรด Rails และเก็บกลุ่มสินทรัพย์ไว้ใน Gemfile ของคุณโปรดทราบว่า Rails จะไม่ต้องการกลุ่มสินทรัพย์โดยอัตโนมัติอีกต่อไปเมื่อรวบรวมเนื้อหาในการผลิต คุณจะต้องทำสิ่งนั้นด้วยตัวเองหรือเพิ่มRAILS_GROUPS=assets(ดูRails.groups) ก่อนคำสั่งเพื่อรวบรวมเนื้อหาล่วงหน้าในการผลิตในสภาพแวดล้อมการสร้างของคุณ
Ajedi32

คำตอบ:


100

ก่อนหน้านี้กลุ่มสินทรัพย์มีอยู่เพื่อหลีกเลี่ยงการรวบรวมตามความต้องการโดยไม่ได้ตั้งใจในการผลิต เนื่องจาก Rails 4 ไม่ทำงานเช่นนั้นอีกต่อไปจึงควรนำกลุ่มเนื้อหาออก

นี่คือรายละเอียดเพิ่มเติมในการกระทำที่เปลี่ยนแปลงสิ่งนั้น ฉันดึงคำพูดบางส่วนพร้อมคำตอบจริง

อัญมณีบางชนิดอาจจำเป็น (ในการผลิต) เช่นรางกาแฟหากคุณใช้เทมเพลตกาแฟและความจริงที่ว่าตอนนี้สินทรัพย์ไม่ได้ถูกรวบรวมไว้ล่วงหน้าตามความต้องการในการผลิตอีกต่อไป

(ไม่ได้ทำการคอมไพล์ล่วงหน้าตามความต้องการในการผลิต) หมายความว่าหากคุณมีอัญมณีนั้นในสภาพแวดล้อมการผลิตใน 3.2.x และลืมที่จะทำการคอมไพล์ล่วงหน้า Rails จะทำสิ่งที่มันทำในการพัฒนารวบรวมเนื้อหาที่ร้องขอไว้ล่วงหน้า สิ่งนี้ไม่เป็นความจริงอีกต่อไปใน Rails 4 ดังนั้นหากคุณไม่คอมไพล์เนื้อหาล่วงหน้าโดยใช้งานคุณจะได้รับ 404 เมื่อมีการร้องขอเนื้อหา


32
มันยังประหยัดหน่วยความจำไม่ใช่เหรอ? ตอนนี้อัญมณีทั้งหมดแม้กระทั่งที่ไม่จำเป็นใน "การผลิต" (เฉพาะในพรีคอมไพล์) ก็ถูกโหลดและทำให้รางใช้หน่วยความจำมากขึ้น
gucki

3
+1 @gucki และเวลาในการโหลด นี่คือความเข้าใจของฉันเกี่ยวกับกลุ่ม .. เนื่องจากมีตัวเลือก config ที่จะปิดการใช้งาน live compile อยู่แล้ว "สนับสนุน" จำนวนเท่าไหร่ที่นี่ แอพ afaik my Rails 3 มีบรรทัดใน env / prod.rb ซึ่งโหลดสินทรัพย์ในการพัฒนา ถ้าเป็นอย่างนั้นเราจะเพิ่มต่อไปได้ไหม
Karthik T

กลุ่มเนื้อหาจะถูกลบออก ก่อนหน้านี้อัญมณีที่อยู่ในทรัพย์สินถูกบรรจุเข้าสู่การผลิตตอนนี้จะเป็นอย่างไรถ้าเราต้องการมันในการผลิต ดังนั้นจึงควรมีภาระในการผลิตการลบกลุ่มสินทรัพย์จึงมั่นใจได้ว่า ต้องคอมไพล์เนื้อหาล่วงหน้าก่อนที่จะย้ายไปผลิต
prashantsahni

13

Rails 4 พยายามบังคับให้คุณคอมไพล์ทรัพย์สินของคุณล่วงหน้าก่อนที่จะนำไปใช้ คุณต้องคอมไพล์ทรัพย์สินของคุณล่วงหน้าด้วย

$ RAILS_ENV=production bundle exec rake assets:precompile

และทำไม? ฉันพบสิ่งนี้ใน Guide:

โดยค่าเริ่มต้น Rails จะถือว่าเนื้อหาได้รับการคอมไพล์ล่วงหน้าและเว็บเซิร์ฟเวอร์ของคุณจะให้บริการเป็นสินทรัพย์แบบคงที่

(ที่มา: http://edgeguides.rubyonrails.org/asset_pipeline.html#in-production )

แต่หลายครั้งคุณต้องใช้อัญมณี 'สินทรัพย์' เหล่านี้ในการผลิต ... ตัวอย่างเช่นหากคุณใช้ไฟล์ js.coffee ในไดเร็กทอรี views ของคุณ Rails ก็ต้องการคอมไพเลอร์กาแฟในโหมดการผลิตเช่นกัน

ดังนั้นฉันเดาว่าเหตุผลของการเปลี่ยนแปลงนี้คือการปรับปรุงประสิทธิภาพ ... และดูง่ายขึ้นเช่นกัน :)


22
รางสมมติว่าสินทรัพย์ที่ได้รับการ precompiled เป็นอาร์กิวเมนต์สำหรับการรักษาassetsกลุ่มไม่ได้รับการกำจัดมัน (ถ้าสินทรัพย์จะถูก precompiled แล้วอัญมณีเหล่านี้จะไม่จำเป็นต้องใช้ในการผลิตและไม่ควรรวมโดย Bundler) และใช่บางทีคุณอาจจะใช้อัญมณีเหมือนcoffee-railsในการผลิต ... แต่ก็เป็นเช่นนั้นใน Rails 3 ด้วยใช่ไหม? และ Rails 3 จะcoffee-railsอยู่ในassetsกลุ่มโดยค่าเริ่มต้น เหตุใดจึงต้องเปลี่ยน Rails 4?
jemmons

1
ทำไมคุณถึงใช้ไฟล์ js.coffee ในไดเรกทอรีมุมมองของคุณ สิ่งนี้ควรอยู่ในสินทรัพย์ / จาวาสคริปต์
Marnen Laibow-Koser

3

เราต้องการ Coffeescript กับ AJAX ( ประวัติ ) จึงcoffee-railsย้ายออกจากกลุ่มสินทรัพย์
sass-railsพฤติกรรมที่ไม่เหมาะสม ( ประวัติ ) ดังนั้นจึงย้ายออกจากกลุ่มสินทรัพย์

ขวานกลุ่มสินทรัพย์


2
CoffeeScript ไม่ควรอยู่ในมุมมอง คุณสามารถทำ Ajax ได้หากไม่มีสิ่งนั้น คุณไม่จำเป็นต้องสร้าง JS แบบไดนามิกเพื่อทำ Ajax อันที่จริงคุณไม่ควรสร้าง JS แบบไดนามิก คอมไพล์ไฟล์ CoffeeScript ของคุณล่วงหน้าและหลีกเลี่ยงปัญหาทั้งหมด
Marnen Laibow-Koser

1
ราง sass ทำงานผิดปกติเนื่องจากBundler.require :assetsไม่ได้ทำงาน นั่นไม่ใช่เหตุผลในการลบกลุ่มเนื้อหา ฉันไม่ต้องการ therubyracer, libv8 et c ในการผลิตทำไมใคร ๆ ถึงทำ? เทมเพลต Coffee สามารถรวบรวมเป็นเทมเพลต JS ได้และไม่มีจุดที่จะรวบรวมทุกครั้งที่มีการแทนที่ค่าใหม่ ไม่มีประเด็นใดที่จะรับภาระทั้งหมดนี้ไปสู่การผลิต
phil pirozhkov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.