Ruby — загрузка драгоценных камней из каталога, отличного от каталога по умолчанию

#ruby #gem #rubygems #jruby

#ruby #драгоценный камень #rubygems #jruby

Вопрос:

Я пытаюсь загрузить RubyGems из каталога, отличного от каталога по умолчанию, который по умолчанию (пожалуйста, поправьте меня здесь, если я ошибаюсь) указан в Gem.path array . Мне уже удалось загрузить единственный драгоценный камень, который у меня установлен в моем каталоге, отличном от каталога по умолчанию (который есть 'rubyzip' ), однако только в нескольких случаях…

Я использую JRuby 1.7.12 и Ruby 1.9.3.

Вот мои результаты тестирования:

Загрузка драгоценных камней из «E:/rb/gems_ » справочник:

 Gem.path
=> ["C:/Users/default/.gem/jruby/1.9", "file:/E:/rb/libraries/jruby.jar!/META-INF/jruby.home/lib/ruby/gems/shared"]
Gem.path[0] = "E:/rb/gems_"
=> "E:/rb/gems_"
require 'zip'
=> true
 

В приведенном выше тесте я заменил путь к gem, связанный с пользователем по умолчанию, на мой «E:/rb/gems_ «каталог, и все работало просто отлично.

 Gem.path.clear
=> []
Gem.path.unshift "E:/rb/gems_"
=> ["E:/rb/gems_"]
require 'zip'
=> true
 

Опять же, несмотря на то, что я очистил весь массив и заменил его своей собственной записью, все работало просто отлично.

Загрузка драгоценных камней из «E:/rb/gems » каталог (теперь подчеркивания нет. Я проверил даже возможность неправильного именования):

 Gem.path.clear
=> []
Gem.path.unshift "E:/rb/gems"
=> ["E:/rb/gems"]
require 'zip'
=> true
 

Этот тест также был успешно завершен.

И вот наступает последний тест:

 Gem.path.clear
=> []
require 'zip'
LoadError: no such file to load -- zip
        from org/jruby/RubyKernel.java:1065:in `require'
        from file:/E:/rb/libraries/jruby.jar!/META-INF/jruby.home/lib/ruby/share
d/rubygems/core_ext/kernel_require.rb:55:in `require'
        from (irb):4:in `evaluate'
        from org/jruby/RubyKernel.java:1101:in `eval'
        from org/jruby/RubyKernel.java:1501:in `loop'
        from org/jruby/RubyKernel.java:1264:in `catch'
        from org/jruby/RubyKernel.java:1264:in `catch'
        from file:/E:/rb/libraries/jruby.jar!/META-INF/jruby.home/bin/jirb:13:in
 `(root)'
        from org/jruby/RubyKernel.java:1081:in `load'
        from file:/E:/rb/libraries/jruby.jar!/jruby/commands.rb:1:in `(root)'
        from jirb:1:in `(root)'
Gem.path
=> []
Gem.path.clear.unshift "E:/rb/gems"
=> ["E:/rb/gems"]
require 'zip'
LoadError: no such file to load -- zip
        from org/jruby/RubyKernel.java:1065:in `require'
        from file:/E:/rb/libraries/jruby.jar!/META-INF/jruby.home/lib/ruby/share
d/rubygems/core_ext/kernel_require.rb:55:in `require'
        from (irb):7:in `evaluate'
        from org/jruby/RubyKernel.java:1101:in `eval'
        from org/jruby/RubyKernel.java:1501:in `loop'
        from org/jruby/RubyKernel.java:1264:in `catch'
        from org/jruby/RubyKernel.java:1264:in `catch'
        from file:/E:/rb/libraries/jruby.jar!/META-INF/jruby.home/bin/jirb:13:in
 `(root)'
        from org/jruby/RubyKernel.java:1081:in `load'
        from file:/E:/rb/libraries/jruby.jar!/jruby/commands.rb:1:in `(root)'
        from jirb:1:in `(root)'
Gem.path
=> ["E:/rb/gems"]
 

И здесь начинается «интересная» часть. Я попытался загрузить 'zip' файл, когда в Gem.path массиве не было записи, что, очевидно, не удалось, это, конечно, более чем хороший результат. Однако, когда я заполнил массив ровно одной записью, указывающей на каталог, отличающийся от каталога по умолчанию, с помощью моего RubyZip gem, он снова потерпел неудачу!

Мой вопрос: почему не удалось выполнить второй этап загрузки RubyGem? Есть ли что-то, что я упускаю из виду? Является ли этот подход к загрузке драгоценных камней из каталога, отличного от каталога по умолчанию, правильным или есть лучший?

Комментарии:

1. Вам всегда может потребоваться абсолютный путь. Я бы изменил путь поиска только в том случае, если у вас много файлов, которые вам требуются из нестандартного местоположения.

2. Вы смотрели на наборы драгоценных камней RVM ( rvm.io/gemsets/basics ) это позволяет вам иметь определенные, разделенные наборы драгоценных камней, которые вы можете определить. При необходимости я могу уточнить в ответе.

3. Спасибо за ваши комментарии! Решение, предложенное Максом, в значительной степени правильное, но не соответствует моей цели. Я пытаюсь полностью изменить каталог по умолчанию для Ruby Gems с сохранением всех функций. Другой комментарий, написанный Мартином, снова верен. Но я не хочу полагаться на RVM. На самом деле, было бы невозможно достичь того, чего я хочу, полагаясь на RVM. Тем не менее, позвольте мне поблагодарить вас обоих, ребята, за ваши комментарии! Я действительно ценю вашу работу! 🙂

4. Вы могли бы просто добавить в Gem.default_path() << YOUR_FULL_PATH

5. Привет, looseseal_90, спасибо за ваш комментарий! К сожалению, это вообще не сработало, посмотрите результат сами: E:rblibraries>java -jar jruby.jar -S irb Gem::path.clear.unshift "E:/rb/gems" => ["E:/rb/gems"] Gem::Specification.find_all_by_name "rubyzip" => [#<Gem::Specification:0x7fa rubyzip-1.1.4>] exit E:rblibraries>java -jar jruby.jar -S irb Gem::default_path.clear.unshift "E:/rb/gems" => ["E:/rb/gems"] Gem::Specification.find_all_by_name "rubyzip" => []