質問: develop環境にてメインプログラムとは別のディレクトリにツールを配置ライブラリの管理はbundleを利用して実行しようとしたのですが 「bundle exec ruby example.rb」とした際に「Could not find ~ in any of the sources」と出力されrbファイルが実行できません。 ネットの海に解決策を探しに出たのですが何をしても解決につながらなかったので質問させていただきたいです。 ### 環境 AmazonLinux AMI release 2016.09 Apache 2.4.27(Unix) ※ソースからビルド Ruby 2.4.1 ※ソースからビルド bundle 1.15.4 Git ※ソースからビルドしている物は別の人物が担当していたため、どういう手順で行ったのかは不明。 ### 今どうなっているか 以下のディレクトリ構成でツールプロジェクトを作成(bundle init済のソースをgit cloneする) ``` tools/ xxx_tool/ Gemfile example.rb [Gemfile]--------------- # frozen_string_literal: true source "https://rubygems.org" git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } gem 'mysql2' ``` xxx_toolにて「bundle install --path vendor/bundle」実行 ``` tools/ xxx_tool/ Gemfile Gemfile.lock example.rb vendor/ ``` 「bundle exec ruby example.rb」実行すると以下の出力がされコードの実行に失敗 ``` Could not find mysql2-0.5.2 in any of the sources Run `bundle install` to install missing gems. ``` 「bundle list」や「bunsle show mysql2」とやるもGemは存在する...。 ``` [bundle show mysql2] ./tools/xxx_tool/vendor/bundle/ruby/2.4.0/gems/mysql2-0.5.2 ``` Gemファイルは存在するしPathもあってるっぽいのになぜ実行時には「Gemのソースが見つかりません」となるのかわからない..。 ### 試したこと ・「rm -rf ~/.gem/」でホームディレクトリに生成される.gemの削除 ・.bundle/config内の「BUNDLE_DISABLE_SHARED_GEMS: 'true'」行削除 ・gem パッケージのアップデート ・Gemfile.lockを削除 (bundle自体のアップデートはメインプログラムへの影響が懸念でできていない) 色々とネットに載っている解決策を試みたが現状変わらずです..。 tool自体の中身は「puts "test"」の一行のみにしても変わらずCould not.....と言われるので bundle側のPathの方の問題なのかとも思ったのですが、思いつくところはすべて調べあげても未だ解決に至らずという状況です。 もし同じような境遇に有った方や解決策をご存じの方がいらっしゃったら是非ご教示願えないでしょうか。 追記: 上記の件について解決できました。 が、根本的な原因が分かっていないので、質問内容を変更させていただきたいと思います。 まず、今回の実行環境ですがお伝え損ねた所があります。 OSにインストールされているRubyについてはAmazonLinuxでデフォルトインストールされているRuby2.0.0とソースから手動でビルドしたRuby2.4.1が存在します。 bundle自体はRuby2.4.1にインストールしたものを使っています。 path指定せずに「bundle exec ruby example.rb」とした場合Ruby2.0.0で実行され以下のエラーが出ていたのですが ``` Could not find mysql2-0.5.2 in any of the sources Run `bundle install` to install missing gems. ``` 「bundle exec /opt/local/ruby2.4.1/bin/ruby example.rb」のようにbundleを入れているRuby2.4.1を指定してあげることで期待通りに動きました。 ・このようにRuby環境が複数ある場合でbundle exec rubyする際にbundleの本体が入っているRuby以外を実行した際には プロジェクトにbundle installしたvendor/bundeのGemは見に行かないのでしょうか? 一体どこのGemを見に行ってエラーを出しているのか分からず。。 ご存じの方がいたら是非ご教示いただきたいです。
回答: Ruby2.0.0とRuby2.4.1で`bundle install`を実行したときにgemがインストールされるパスが異なるためだと思われます。 たぶん、最初に`bundle install`したときはRuby2.4.1向けにインストールされたbundleコマンドが使用されており、その際には vendor/bundle/ruby/2.4.0 以下にgemがインストールされたはずです。 (最初に`bundle install`したときに使われているbundleコマンドがどのRubyに対してインストールされたものなのかによる気がします) パスを設定せずに`bundle exec ruby example.rb`を実行した場合は、Ruby2.0.0を起動していたようですが、このときはおそらく vendor/bundle/ruby/2.0.0 以下にあるはずのmysql2 gemを参照しようとして見つからずエラーになっていたと考えられます。