#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" => []