'ต้องการ: false' ใน Gemfile หมายถึงอะไร


429

ทำสิ่งนี้:

gem 'whenever', require: false

หมายความว่าต้องติดตั้งอัญมณีหรือหมายความว่าไม่จำเป็นต้องใช้?


1
คำตอบส่วนใหญ่ (รวมถึงคำตอบที่ยอมรับได้) เป็นเรื่องเกี่ยวกับ Rails ที่ทำBundler.requireตามค่าเริ่มต้นตามที่ฉันเข้าใจ มีเพียงคำตอบของ Ciro และ Nesha เท่านั้นที่ถูกต้อง
Nakilon

คำตอบ:


472

หมายความว่าติดตั้งอัญมณี แต่ไม่ต้องโทรเมื่อคุณเริ่ม Bundler ดังนั้นคุณจะต้องโทรด้วยตนเอง

require "whenever"

ถ้าคุณต้องการใช้ห้องสมุด

ถ้าคุณจะทำ

gem "whenever", require: "whereever"

จากนั้นตัวรวบรวมจะดาวน์โหลดอัญมณีชื่อเมื่อใดก็ตาม แต่จะเรียก

require "whereever"

สิ่งนี้มักจะถูกใช้ถ้าชื่อของไลบรารีที่ต้องการแตกต่างจากชื่อของอัญมณี


112
@VenkatD บางครั้งคุณต้องการติดตั้งอัญมณีบางอย่าง แต่คุณไม่ต้องการโหลดมันในทุกขั้นตอน ฉันมีภารกิจคราดโดยเฉพาะที่ฉันต้องการเรียกใช้ Heroku เป็นระยะ ๆ ผ่านส่วนเสริมตามกำหนดเวลา ภารกิจเรคนี้โดยเฉพาะต้องใช้อัญมณีบางอย่างที่แอปพลิเคชันอื่นไม่ต้องการ ดังนั้นฉันจึงเลือก:require => falseอัญมณีเฉพาะเหล่านี้และrequire "thegem"จากภารกิจเรค นี่จะเป็นการบันทึกหน่วยความจำในกระบวนการแอปหลักและเวลาเริ่มต้นเป็นต้นประสิทธิภาพของแอปอย่างไรก็ตามไม่ควรได้รับผลกระทบแม้ว่าคุณจะต้องการอัญมณีเพิ่มเติมเหล่านี้ในทุกขั้นตอนก็ตาม
Michael van Rooijen

5
@MichaelvanRooijen - จุดที่ยอดเยี่ยมอย่างไรก็ตาม: "ประสิทธิภาพของแอปไม่ควรได้รับผลกระทบแม้ว่าคุณจะต้องการอัญมณีเพิ่มเติมเหล่านี้ในทุกขั้นตอน" ฉันไม่คิดว่ามันเป็นเรื่องจริง วัตถุจัดสรรเวลาทำงานและ GC มีการวิ่งผ่านทั้งหมดของพวกเขาในแต่ละครั้งเพื่อให้มากขึ้น = ช้าลงตามconfreaks.com/videos/2668-gogaruco2013-measuring-ruby
นาธานยาว

1
@MichaelvanRooijen - ในทางปฏิบัติคุณพูดถูกมันไม่สำคัญเว้นแต่คุณจะใช้ห้องสมุด แต่ต้องมีอัญมณีอย่างน้อยจะโหลดไฟล์หลักใน lib และอาจจะต้องการมากกว่าของตัวเอง แม้ว่าคุณrequire 'yaml'คุณจะมีYAMLโมดูลเป็นวัตถุในหน่วยความจำ
นาธานลอง

2
ถ้าคุณต้องการตั้งค่าต้องเป็นเท็จและชื่อไลบรารีนั้นแตกต่างจากชื่ออัญมณีด้วยเช่นกัน
Peter-Jan Celis

2
@ Peter-JanCelis ในกรณีที่คุณเพิ่งจะตั้งค่า:require => falseแล้วในรหัสของคุณมีrequire 'library_name_here'
Rob Di Marco

73

คุณใช้:require => falseเมื่อคุณต้องการให้ติดตั้งอัญมณี แต่ไม่จำเป็นต้องมี

ดังนั้นในตัวอย่างที่คุณให้: เมื่อมีคนวิ่งมัดติดตั้งเมื่อใดก็ตามที่พลอยจะได้รับการติดตั้งเช่นเดียวกับgem 'whenever', :require => false gem install wheneverเมื่อใดก็ตามที่ใช้ในการสร้างงาน cron โดยการเรียกใช้งาน rake แต่โดยปกติจะไม่ได้ใช้จากภายในแอพพลิเคชั่นทางรถไฟ

ดังนั้นคุณสามารถใช้:require => falseสำหรับทุกสิ่งที่คุณต้องการเรียกใช้จากบรรทัดคำสั่ง แต่ไม่ต้องการในโค้ดของคุณ


6
สิ่งนี้สามารถใช้สำหรับอัญมณีที่คุณใช้ในคำขอย่อยเพียงเล็กน้อยเท่านั้น
Nathan Long

61

require: falseบอกBundler.requireไม่ได้ว่าจะต้องใช้เฉพาะอัญมณี: require 'gem'อัญมณีจะต้องถูกต้องอย่างชัดเจนผ่านทาง

ตัวเลือกนี้จะไม่ส่งผลกระทบ:

  • bundle install: อัญมณีจะได้รับการติดตั้งโดยไม่คำนึงถึง

  • การrequireตั้งค่าพา ธ การค้นหาโดยตัวรวม

    Bundler เพิ่มสิ่งต่าง ๆ ลงในพา ธ เมื่อคุณทำสิ่งใดสิ่งหนึ่งต่อไปนี้

    • Bundle.setup
    • ซึ่งถูกเรียกโดย require bundler/setup
    • ซึ่งถูกเรียกโดย bundle exec

ตัวอย่าง

Gemfile

source 'https://rubygems.org'
gem 'haml'
gem 'faker', require: false

main.rb

# Fail because we haven't done Bundler.require yet.
# bundle exec does not automatically require anything for us,
# it only puts them in the require path.
begin Haml; rescue NameError; else raise; end
begin Faker; rescue NameError; else raise; end

# The Bundler object is automatically required on `bundle exec`.
Bundler.require

Haml
# Not required because of the require: false on the Gemfile.
# THIS is what `require: false` does.
begin Faker; rescue NameError; else raise; end

# Faker is in the path because Bundle.setup is done automatically
# when we use `bundle exec`. This is not affected by `require: false`.
require 'faker'
Faker

จากนั้นต่อไปนี้จะไม่เพิ่มข้อยกเว้น:

bundle install --path=.bundle
bundle exec ruby main.rb

บน GitHubเพื่อให้คุณเล่นกับมัน

การใช้งาน Rails

ตามที่อธิบายไว้ในบทช่วยสอนการเริ่มต้นแม่แบบ Rails เริ่มต้นจะทำงานเมื่อเริ่มต้น:

  • config/boot.rb
  • config/application.rb

config/boot.rb ประกอบด้วย:

ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])

ซึ่งทำrequire 'bundler/setup'และตั้งค่าพา ธ ที่ต้องการ

config/application.rb ทำ:

Bundler.require(:default, Rails.env)

ซึ่งต้องใช้อัญมณีจริง


โปรดทราบว่าการใช้require 'fakerอาจไม่ใช้เวอร์ชันอัญมณีที่ถูกต้องโดยเฉพาะถ้าคุณเป็น Gemfile ชี้ไปที่การอ้างอิงแบบ git
dazonic

@dazonic เป็น Haml ที่แตกต่างกันในตัวอย่าง?
Ciro Santilli 郝海东冠状病六四事件法轮功

9

เมื่อใดก็ตามที่คุณระบุ Gem ในGemfileและรัน bundle installBundler จะไปและติดตั้ง gem ที่ระบุและโหลดโค้ดสำหรับ Gem ในแอพของคุณโดยการวาง require 'whenever'วิธีนี้ Bundler จะโหลดโค้ดสำหรับ Gems ของคุณทั้งหมดในแอพ Rails ของคุณและคุณสามารถเรียกวิธีใดก็ได้ จากอัญมณีใด ๆ โดยไม่มีความเจ็บปวดเหมือนที่คุณทำเกือบตลอดเวลา

แต่ Gems like whenever, faker or capistrano เป็นสิ่งที่คุณไม่ต้องการในรหัสแอพของคุณที่คุณต้องการเมื่อใดก็ตามที่รหัสในschedule.rb ไฟล์ของคุณเพื่อจัดการ crons และรหัส capistrano ในdeploy.rb ไฟล์เพื่อกำหนดสูตรการปรับใช้ดังนั้นคุณไม่จำเป็นต้องโหลดรหัสสำหรับอัญมณีเหล่านี้ในรหัสแอปของคุณ ต้องการที่จะเรียกวิธีการใด ๆ จากอัญมณีเหล่านี้คุณสามารถด้วยตนเองต้องใช้อัญมณี thsese require "whenever" ด้วยตัวเองโดยการวาง ดังนั้นคุณใส่:require => falseGemfile สำหรับ Gem เหล่านี้ด้วยวิธีนี้ Bundler จะติดตั้ง Gem นั้น แต่ไม่โหลดโค้ดสำหรับ Gem นั้นเองคุณสามารถทำได้ทุกเมื่อที่คุณต้องการโดยเพียงแค่ใส่ like ต้องการ 'เมื่อใดก็ตาม' ในกรณีของคุณ


2

ในการสั่งซื้อที่จะต้องใช้อัญมณีใน Gemfile Bundler.requireของคุณคุณจะต้องเรียก

คุณสามารถป้องกันไม่ให้ Bundler ต้องการอัญมณีด้วยrequire: falseแต่มันจะยังคงติดตั้งและดูแลรักษาอัญมณี ตรวจสอบนี้ออกสำหรับคำอธิบายรายละเอียดเพิ่มเติม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.