哪里需要拉取系统上不存在的 ruby​​ 文件?

问题描述

我按照 bundler.io 中的步骤操作,正在创建自己的 gem。

现在我正在研究 Rakefile。我看到了:

require "bundler/gem_tasks"

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

是否只是指向这个文件:https://github.com/rubygems/bundler/blob/master/lib/bundler/gem_tasks.rb?你能像这样引用单个 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

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

解决方法

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

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

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

如果您使用 --disable-gems 命令行参数启动 Ruby,它不会自动加载 ruby​​gems,因此不会添加其自定义的 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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...