Где требуется вытащить рубиновые файлы, которых нет в системе?

Я выполнил шаги из 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 buildbundler/gem_tasks будет скачиваться из интернета?

🤔 А знаете ли вы, что...
Ruby известен своей философией 'Принципов языка Ruby' (The Ruby Way), которая включает в себя простоту и элегантность.


1
110
2

Ответы:

Решено

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