require pull ruby 系统中不存在的文件在哪里?

Where does require pull ruby files that don't exist on the system?

我按照 bundler.io 中的步骤创建了自己的 gem。

现在我正在调查 Rakefile。我看到了:

require "bundler/gem_tasks"

但据我所知我没有 bundler/gem_tasks。那么这是如何工作的呢?该文件应该在哪里? require 如何找到不在其文件夹中的文件?!

是否只是指向这个文件:https://github.com/rubygems/bundler/blob/master/lib/bundler/gem_tasks.rb?你能用 like

引用单个 ruby 文件吗
require someGem/someRubyfile

ruby docs 对此不清楚。

我已经查看了 this question 并检查了我的 $LOAD_PATH。它仅包含以下内容:

 "/Library/Ruby/Gems/2.6.0/gems/did_you_mean-1.3.0/lib",
 "/Library/Ruby/Gems/2.6.0/gems/coderay-1.1.3/lib",
 "/Library/Ruby/Gems/2.6.0/gems/method_source-1.0.0/lib",
 "/Library/Ruby/Gems/2.6.0/gems/pry-0.13.1/lib",
 "/Library/Ruby/Site/2.6.0",
 "/Library/Ruby/Site/2.6.0/x86_64-darwin19",
 "/Library/Ruby/Site/2.6.0/universal-darwin19",
 "/Library/Ruby/Site",
 "/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/vendor_ruby/2.6.0",
 "/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/vendor_ruby/2.6.0/x86_64-darwin19",
 "/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/vendor_ruby/2.6.0/universal-darwin19",
 "/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/vendor_ruby",
 "/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0",
 "/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/x86_64-darwin19",
 "/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/universal-darwin19"]

我没有看到提到 bundler

我也没有在 ~/.bundle 中看到任何与 gem_tasks 相关的内容。这是否意味着 rake build bundler/gem_tasks 将从互联网上下载?

Rubygems 用 its own method 覆盖 Ruby 自己的 Kernel#require 方法,按需加载 gems(即添加gem 到 $LOAD_PATH 然后需要请求的文件)。

因此,当您执行 require 'bundler/gem_tasks' 时,发生的情况是 rubygems 在其 [=13] 中搜索包含 bundler/gem_tasks.rb 的 gem =] 路径(在每个 gem 的相应 gemspec 中指定)。如果在您的系统上找到匹配的 gem,其 require_paths 将添加到 $LOAD_PATH 并调用 Ruby 的原始 require 方法,这将加载请求的文件。

无论如何,Ruby 和 Rubygems 都不会从互联网动态加载 gems。它只会使用本地安装的 gems 到配置的 GEM_PATHS。您可以在命令行上找到 运行 gem env 搜索已安装 gem 的已配置路径。

如果您使用 --disable-gems 命令行参数启动 Ruby,它不会自动加载 rubygems,因此不会添加它的自定义实现 Kernel#require。此处,仅需要您专门添加到 $LOAD_PATH 的位置中的文件。

这条评论太大了。它完全被接受的答案注销:

我的 require_paths 是这样的:spec.require_paths = ["lib"] 所以绝对不存在。因此,当我执行 gem env 时,我得到了以下信息:

RubyGems Environment:
  - RUBYGEMS VERSION: 3.0.3
  - RUBY VERSION: 2.6.3 (2019-04-16 patchlevel 62) [universal.x86_64-darwin19]
  - INSTALLATION DIRECTORY: /Library/Ruby/Gems/2.6.0
  - USER INSTALLATION DIRECTORY: /Users/honey/.gem/ruby/2.6.0
  - RUBY EXECUTABLE: /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/ruby
  - GIT EXECUTABLE: /usr/local/bin/git
  - EXECUTABLE DIRECTORY: /usr/local/bin
  - SPEC CACHE DIRECTORY: /Users/honey/.gem/specs
  - SYSTEM CONFIGURATION DIRECTORY: /Library/Ruby/Site
  - RUBYGEMS PLATFORMS:
    - ruby
    - universal-darwin-19
  - GEM PATHS:
     - /Library/Ruby/Gems/2.6.0
     - /Users/honey/.gem/ruby/2.6.0
     - /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/gems/2.6.0
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - https://rubygems.org/
  - SHELL PATH:
     - /Users/honey/google-cloud-sdk/bin
     - /usr/local/bin
     - /usr/bin
     - /bin
     - /usr/sbin
     - /sbin
     - /Library/Apple/usr/bin

所以第一个 GEM PATHS 是:/Library/Ruby/Gems/2.6.0。按照面包屑导航,我到达了:/Library/Ruby/Gems/2.6.0/gems/bundler-2.2.2/lib/bundler 在那里我找到了 gem_tasks.rb