如何解决哪里需要拉取系统上不存在的 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 build
时 bundler/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,它不会自动加载 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。