Open3やDaemonsを使って外部のRubyスクリプトを実行する際に、実行に必要なgemをロードできるようにしたい
つまってしまったので教えてください。
Rais,Rubyは初めて書いているので、見当違いのことをしているかもしれません。
RailsからOpen3のcapture3メソッドを実行してデーモンを立ち上げたいのですが、「cannot load such file」となってしまいました。
# top_controller.rb(Railsからの呼び出し処理)
def daemon_start
cmd = "/bin/app start;"
out, err, status = Open3.capture3(cmd)
p out
p err
p status.exitstatus
redirect_to root_path
end
# app(呼び出されるapp)
#!/usr/bin/env ruby
require 'bundler/setup'
require 'daemons'
require 'pathname'
base_dir = Pathname('../../').expand_path(__FILE__)
Daemons.run(
base_dir.join('bin/bot'),
app_name: 'bot',
dir_mode: :normal,
dir: base_dir.join('tmp'),
log_dir: base_dir.join('log'),
log_output: true
)
#表示内容(err)
"bin/app:3:in `require': cannot load such file -- daemons (LoadError)\n\tfrom bin/app:3:i"
以下、試してみたことです。
appをターミナルから実行
→問題なく起動します。ruby -Iでgemのパスを追加
cmdを
cmd = "ruby -I /Users/owner/.rvm/gems/ruby-2.2.0/gems/daemons-1.2.3/lib /bin/app start;"
と変えたところ、エラーは出なくなります。
(-Iで/Users/owner/.rvm/gems/ruby-2.2.0/gems/を渡すと最初のエラーと変わらずです)requireしているパスを絶対パスに変更
同じ様に、エラーは出なくなります。app内で$LOAD_PATH.unshiftする
$LOAD_PATH.unshift('/Users/owner/.rvm/gems/ruby-2.2.0/gems/daemons- 1.2.3/lib')
同じ様に、エラーは出なくなります。
ただ、上2つもそうなのですが、appから呼ばれるbotの中でrequireしているgemが見つからないとなってしまいます。
#そのときのエラー表示内容
(botがrequireしているretryableの中でrequireしているファイルが見つからない)
/Users/owner/.rvm/gems/ruby-2.2.0/gems/retryable-2.0.2/lib/retryable.rb:1:in `require': cannot load such file -- retryable/version (LoadError)
【質問】
appをターミナルから実行すれば正常に動いているので、パスが通ってないことが問題と考えています。
使用するgemに上で試したことと同じ対応をすべてのgemにすればなんとかなるのかもしれませんですが、それなりの数があるため避けたいです。
もっといい方法でパスを通す方法があるでしょうか?
なんでもいいので教えていただきたいです。
足りない情報があれば追記します。
よろしくお願いします。
【環境】
Rails:4.1
Ruby:2.2.0(Railsで使用)
Ruby:2.2.0(appで使用)