Bundler не разрешает использовать драгоценные камни в домашнем каталоге проекта - PullRequest
0 голосов
/ 13 марта 2019

Я работаю над программой, которая помогает запускать код Ruby из командной строки (на https://github.com/keithrbennett/rexe, gem install rexe).

Когда я gem install отправляю его и перехожу в корневой каталог проекта, и пытаюсь require файл, отсутствующий в Gemfile, происходит сбой:

➜  rexe git:(master) ✗   rexe -r awesome_print -oa '"hello"'
Traceback (most recent call last):
    12: from /Users/kbennett/.rvm/gems/ruby-2.6.0/bin/ruby_executable_hooks:24:in `<main>'
    11: from /Users/kbennett/.rvm/gems/ruby-2.6.0/bin/ruby_executable_hooks:24:in `eval'
    10: from /Users/kbennett/.rvm/gems/ruby-2.6.0/bin/rexe:23:in `<main>'
     9: from /Users/kbennett/.rvm/gems/ruby-2.6.0/bin/rexe:23:in `load'
     8: from /Users/kbennett/work/rexe/exe/rexe:403:in `<top (required)>'
     7: from /Users/kbennett/.rvm/gems/ruby-2.6.0/gems/bundler-2.0.1/lib/bundler.rb:313:in `with_clean_env'
     6: from /Users/kbennett/.rvm/gems/ruby-2.6.0/gems/bundler-2.0.1/lib/bundler.rb:562:in `with_env'
     5: from /Users/kbennett/.rvm/gems/ruby-2.6.0/gems/bundler-2.0.1/lib/bundler.rb:313:in `block in with_clean_env'
     4: from /Users/kbennett/work/rexe/exe/rexe:403:in `block in <top (required)>'
     3: from /Users/kbennett/work/rexe/exe/rexe:385:in `call'
     2: from /Users/kbennett/work/rexe/exe/rexe:385:in `each'
     1: from /Users/kbennett/work/rexe/exe/rexe:385:in `block in call'
/Users/kbennett/work/rexe/exe/rexe:385:in `require': cannot load such file -- awesome_print (LoadError)

Однако, когда я cd ~, он работает нормально:

➜  ~   rexe -r awesome_print -oa '"hello"'
"hello"%

Я завернул свой код в Bundler.with_clean_env, который, как я думал, должен позаботиться об этом.

Я могу использовать интерпретатор Ruby напрямую, и он работает:

➜  rexe git:(master) ✗   ruby -r awesome_print -e "ap 'hello'"
"hello"

Так что я предполагаю, что Бандлер предполагает, что гемам, не перечисленным в Gemfile, нельзя разрешать загрузку, и это почти всегда разумно, но в моем случае, когда программа должна иметь возможность загружать любой гем вообще, это препятствие.

Я понимаю, что Бандлер находит Gemfile [.lock] и делает то, что считает правильным, но есть ли способ обойти это?

1 Ответ

1 голос
/ 13 марта 2019

Не полный ответ, просто направление: попробуйте добавить путь к запрашиваемому гему до $LOAD_PATH, прежде чем запрашивать самоцвет. Например:

pry(main)> require "awesome_print"                                                                    
LoadError: cannot load such file -- awesome_print

Но тогда

pry(main)> $LOAD_PATH << "<home>/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/awesome_print-1.8.0/lib/";
pry(main)> require "awesome_print"
=> true

Вуаля! Вопрос в том, как найти правильный путь для драгоценного камня, может быть, gem which может помочь ...

...