哪里需要拉取系统上不存在的 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文档对此并不清楚。

我已经研究过这个问题,也检查过我的$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用自己的方法覆盖Ruby自己的Kernel#require方法,该方法根据需要加载gem(即将gem添加到$LOAD_PATH,然后需要请求的文件(。

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

无论如何,Ruby和Rubygems都不会从互联网上动态加载gems。它将只使用本地安装到配置的GEM_PATH的GEM。通过在命令行上运行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

最新更新