Ruby 鲁比:什么是';require:false';你的意思是?
这是否:Ruby 鲁比:什么是';require:false';你的意思是?,ruby,bundler,gemfile,Ruby,Bundler,Gemfile,这是否: gem 'whenever', require: false 这意味着需要安装gem,还是说它不是必需的?这意味着安装gem,但在启动Bundler时不要调用require。因此,您需要手动调用 require "whenever" 如果你想使用图书馆 如果你要做 gem "whenever", require: "whereever" 然后bundler会下载名为where的gem,但会调用 require "whereever" 如果需要的库的名称与gem的名称不同,则通常
gem 'whenever', require: false
这意味着需要安装gem,还是说它不是必需的?这意味着安装gem,但在启动Bundler时不要调用require。因此,您需要手动调用
require "whenever"
如果你想使用图书馆
如果你要做
gem "whenever", require: "whereever"
然后bundler会下载名为where的gem,但会调用
require "whereever"
如果需要的库的名称与gem的名称不同,则通常使用此选项。当您希望安装gem而不是“必需”时,使用
:require=>false
因此,在您给出的示例中:
gem'where',:require=>false
当有人运行bundle时,无论何时安装gem都将与gem install where
一样安装。where用于通过运行rake任务创建cron作业,但通常不在rails(或其他框架,如果不是rails)应用程序中使用
因此,您可以使用
:require=>false
来处理需要从命令行运行但不需要在代码中运行的任何内容。require:false
告诉Bundler。require
不需要特定的gem:gem必须通过require'gem'
明确需要
此选项不影响:
:不管怎样,gem都会被安装bundle install
要求捆绑机设置搜索路径 当您执行以下任一操作时,Bundler会将内容添加到路径:
Bundle.setup
- 由
require bundler/setup
- 由
bundle exec调用
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
让你玩它
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'])
需要“bundler/setup”
并设置所需路径
config/application.rb
执行以下操作:
Bundler.require(:default, Rails.env)
这实际上需要Gem。每当您在
Gem文件中指定Gem并运行bundle install
时,bundler就会在您的应用程序中安装指定的Gem并加载该Gem的代码,方法是将require'where'
这样bundler就会在您的Rails应用程序中加载所有Gem的代码,您可以从任何Gem调用任何方法,而无需任何痛苦,就像大多数时候一样
但是像where、faker或capistrano
这样的gem是你在应用程序代码中不需要的东西,你需要schedule.rb
文件中的where代码来管理deploy.rb
文件中的cron和capistrano代码来定制部署方法,这样你就不需要在应用程序代码中加载这些gem的代码
无论您想从这些gem中调用任何方法,您都可以通过在require“where”
中放置require来手动请求这些gem。因此,您将:require=>false
放在Gem文件中,用于这些Gem,这样bundler将安装该Gem,但不会加载该Gem本身的代码,您可以在任何时候执行此操作,只需在您的案例中添加类似require的“where”即可。为了在Gem文件中要求Gem,您需要调用bundler.require
您可以使用require:false
防止bundler需要gem,但它仍将安装和维护gem。查看更详细的解释。@VenkatD。有时,您希望安装某些gem,但不希望将它们加载到每个进程中。我有一个特殊的rake任务,我想通过Heroku的调度插件定期调用它。这个特殊的rake任务需要应用程序其余部分不需要的某些gem。因此,我:require=>false
这些特定的gem,并且明确地需要rake任务中的“thegem”
。这将节省主应用程序进程中的内存和启动时间等。但是,即使您在每个进程中都需要这些额外的gem,应用程序性能也不应受到影响。@MichaelvanRooijen-但是,要点很好:“但是,即使您在每个进程中都需要这些额外的gem,应用程序性能也不应受到影响”。我认为那不是真的。根据@MichaelvanRooijen的说法,分配对象需要工作,GC每次都必须遍历所有对象,因此more=更慢-实际上,你是对的,除非你使用库,否则通常都不重要。但需要一个gem至少会在lib中加载它的主文件,而且可能它自己需要更多。即使您需要“yaml”
,现在,您将YAML
模块作为内存中的一个对象。如果您想将require设置为false,并且库名称也与gem名称不同,该怎么办?@Peter JanCelis在这种情况下,您只需设置:require=>false
,然后在您的代码中有一个require'library\u name\u here'
这也可以用于gem您只在一小部分请求中使用。请注意,使用require'faker
可能不会使用正确的gem版本,特别是如果您是Gemfile指向git ref.@dazonic Haml在示例中有什么不同吗?大多数答案(包括已接受的答案)都是关于执行绑定器的Rails。据我所知,默认情况下require
。只有西罗和奈莎的答案是正确的。