Я выполнил шаги из bundler.io и создаю свой собственный драгоценный камень.
Сейчас присматриваюсь к Rakefile
. Я понимаю:
require "bundler/gem_tasks"
но насколько я понимаю у меня нет bundler/gem_tasks
. Итак, как это работает? Где, как ожидается, будет находиться этот файл? Как require
находит файлы, которых нет в его папке?!
Он просто указывает на этот файл: https://github.com/rubygems/bundler/blob/master/lib/bundler/gem_tasks.rb? Можете ли вы просто ссылаться на отдельные рубиновые файлы так же, как
require someGem/someRubyfile
В ruby docs нет ясности по этому поводу.
Я уже изучила этот вопрос, а также проверила свой $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
будет скачиваться из интернета?
🤔 А знаете ли вы, что...
Ruby известен своей философией 'Принципов языка Ruby' (The Ruby Way), которая включает в себя простоту и элегантность.
Rubygems перезаписывает собственный Kernel#require
метод Ruby своим собственным методом, который загружает драгоценные камни по требованию (т. е. добавляет драгоценный камень в $ LOAD_PATH, а затем требует запрошенный файл).
Таким образом, когда вы выполняете require 'bundler/gem_tasks'
, происходит то, что rubygems ищет драгоценный камень, содержащий bundler/gem_tasks.rb
, в своем пути require_paths
(который указан в соответствующей спецификации драгоценного камня каждого драгоценного камня). Если в вашей системе найден соответствующий гем, его require_paths
добавляется в $LOAD_PATH
и вызывается оригинальный метод require
Ruby, который загружает запрошенный файл.
В любом случае, ни Ruby, ни Rubygems динамически не загружают драгоценные камни из Интернета. Он будет использовать только гемы, установленные локально для настроенного GEM_PATHS. Вы можете найти настроенные пути для поиска установленных драгоценных камней, запустив gem env
в командной строке.
Если вы запустите Ruby с аргументом командной строки --disable-gems
, он не будет автоматически загружать 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