Я работаю над программой, которая помогает запускать код 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] и делает то, что считает правильным, но есть ли способ обойти это?