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
我按照 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