'Yêu cầu: sai' trong Gemfile có nghĩa là gì?


428

Thực hiện điều này:

gem 'whenever', require: false

có nghĩa là đá quý cần phải được cài đặt, hoặc nó có nghĩa là nó không bắt buộc?


1
Hầu hết các câu trả lời (bao gồm cả câu trả lời được chấp nhận) là về Rails làm Bundler.requiretheo mặc định như tôi hiểu. Chỉ có câu trả lời của Ciro và Nesha là đúng.
Nakilon

Câu trả lời:


472

Điều này có nghĩa là cài đặt đá quý, nhưng không yêu cầu gọi khi bạn khởi động Bundler. Vì vậy, bạn sẽ cần phải gọi bằng tay

require "whenever"

nếu bạn muốn sử dụng thư viện

Nếu bạn phải làm

gem "whenever", require: "whereever"

sau đó bundler sẽ tải xuống viên ngọc có tên bất cứ khi nào, nhưng sẽ gọi

require "whereever"

Điều này thường được sử dụng nếu tên của thư viện cần yêu cầu khác với tên của đá quý.


112
@VenkatD. đôi khi bạn muốn cài đặt một số đá quý nhất định nhưng bạn không muốn tải chúng vào mọi quy trình. Tôi có một nhiệm vụ cào cụ thể mà tôi muốn gọi định kỳ trên Heroku thông qua tiện ích bổ sung theo lịch trình của họ. Nhiệm vụ cào cụ thể này yêu cầu một số đá quý nhất định mà phần còn lại của ứng dụng không cần. Vì vậy, tôi :require => falsenhững viên đá quý đặc biệt và rõ ràng require "thegem"từ nhiệm vụ cào. Điều này sau đó sẽ tiết kiệm bộ nhớ trong các quy trình ứng dụng chính và thời gian khởi động, v.v. Tuy nhiên, hiệu suất ứng dụng sẽ không bị ảnh hưởng ngay cả khi bạn yêu cầu những viên ngọc bổ sung này trong mọi quy trình.
Michael van Rooijen

5
@MichaelvanRooijen - tuy nhiên, điểm tuyệt vời: "Tuy nhiên, hiệu suất ứng dụng không nên bị ảnh hưởng ngay cả khi bạn yêu cầu những viên ngọc bổ sung này trong mọi quy trình". Tôi không nghĩ đó là sự thật. Việc phân bổ các đối tượng sẽ hoạt động và GC phải chạy qua tất cả chúng mỗi lần, vì vậy nhiều hơn = chậm hơn, theo confreaks.com/ideo/2668-gogaruco2013-measuring-ruby
Nathan Long

1
@MichaelvanRooijen - Trong thực tế, bạn nói đúng, nói chung sẽ không có vấn đề gì trừ khi bạn sử dụng thư viện. Nhưng yêu cầu một viên ngọc ít nhất sẽ tải tập tin chính của nó trong lib, và có lẽ nó đòi hỏi nhiều hơn về chính nó. Ngay cả khi bạn require 'yaml', bây giờ bạn có YAMLmô-đun như một đối tượng trong bộ nhớ.
Nathan Long

2
Điều gì sẽ xảy ra nếu bạn muốn đặt yêu cầu thành false và tên thư viện cũng khác với tên đá quý?
Peter-Jan Celis

2
@ Peter-JanCelis Trong trường hợp đó, bạn chỉ cần đặt :require => falsevà sau đó trong mã của bạn có mộtrequire 'library_name_here'
Rob Di Marco

73

Bạn sử dụng :require => falsekhi bạn muốn cài đặt đá quý nhưng không "bắt buộc".

Vì vậy, trong ví dụ bạn đã đưa ra: gem 'whenever', :require => false khi ai đó chạy gói cài đặt, bất cứ khi nào gem sẽ được cài đặt như với gem install whenever. Bất cứ khi nào được sử dụng để tạo các công việc định kỳ bằng cách chạy một tác vụ cào nhưng thường không được sử dụng từ bên trong đường ray (hoặc khung khác nếu không phải đường ray).

Vì vậy, bạn có thể sử dụng :require => falsecho bất cứ thứ gì bạn cần để chạy từ dòng lệnh nhưng không cần trong mã của bạn.


6
Điều này cũng có thể được sử dụng cho một viên ngọc bạn chỉ sử dụng trong một tập hợp nhỏ các yêu cầu.
Nathan Long

61

require: falsenói Bundler.requirekhông yêu cầu đá quý cụ thể đó: đá quý phải được yêu cầu rõ ràng thông qua require 'gem'.

Tùy chọn này không ảnh hưởng đến:

  • bundle install: viên ngọc sẽ được cài đặt bất kể

  • các requirethiết lập đường dẫn tìm kiếm bằng cách bundler.

    Bundler thêm mọi thứ vào đường dẫn khi bạn thực hiện:

    • Bundle.setup
    • được gọi bởi require bundler/setup
    • được gọi bởi bundle exec

Thí dụ

Đá quý

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

chính.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

Sau đó, những điều sau đây sẽ không đưa ra ngoại lệ:

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

Trên GitHub để bạn chơi với nó.

Sử dụng đường ray

Như đã giải thích trong hướng dẫn khởi tạo , mẫu Rails mặc định chạy khi khởi động:

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

config/boot.rb chứa đựng:

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

mà không require 'bundler/setup'và thiết lập đường dẫn yêu cầu.

config/application.rb làm:

Bundler.require(:default, Rails.env)

trong đó thực sự đòi hỏi đá quý.


Lưu ý rằng việc sử dụng require 'fakercó thể không sử dụng phiên bản đá quý chính xác, cụ thể nếu bạn là Gemfile trỏ đến một git ref.
dazonic

@dazonic là Haml nào khác trong ví dụ?
Ciro Santilli 郝海东 冠状 病 事件

9

Bất cứ khi nào bạn chỉ định Đá quý trong Gemfilevà chạy bundle install, trình đóng gói sẽ đi và cài đặt đá quý được chỉ định và tải mã cho Đá quý đó trong ứng dụng của bạn bằng cách đặt cách require 'whenever'này, trình đóng gói sẽ tải mã cho tất cả các Đá quý của bạn trong ứng dụng Rails của bạn và bạn có thể gọi bất kỳ phương thức nào từ bất kỳ Gem nào mà không có bất kỳ đau đớn, như bạn làm hầu hết thời gian.

nhưng Gems like whenever, faker or capistrano là thứ bạn không cần trong mã ứng dụng, bạn cần bất cứ khi nào mã trong schedule.rb tệp của bạn để quản lý mã crons và capistrano trong deploy.rb tệp để tùy chỉnh công thức triển khai, do đó bạn không cần phải tải mã cho các đá quý này trong mã ứng dụng của mình và bất cứ nơi nào bạn muốn gọi bất kỳ phương thức nào từ những viên Đá quý này, bạn có thể tự yêu cầu đá quý của mình bằng cách đặt require "whenever" . Vì vậy, bạn đã đặt :require => falseGemfile của mình cho những viên Đá quý này, bằng cách này, trình đóng gói sẽ cài đặt Gem đó nhưng không tải mã cho chính Gem đó, bạn có thể làm điều đó bất cứ khi nào bạn muốn bằng cách đặt yêu cầu 'bất cứ khi nào' trong trường hợp của bạn.


2

Để yêu cầu đá quý trong Gemfile của bạn, bạn sẽ cần gọi Bundler.require .

Bạn có thể ngăn trình đóng gói yêu cầu đá quý require: false, nhưng nó vẫn sẽ cài đặt và duy trì đá quý. Kiểm tra này để được giải thích chi tiết hơn.

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.