質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

1042閲覧

[Ruby]bundle exec ruby example.rb 実行時にGemがCould not findになる件について

yuuki0218

総合スコア22

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2019/04/08 07:54

編集2019/04/09 09:07

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を見に行ってエラーを出しているのか分からず。。

ご存じの方がいたら是非ご教示いただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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を参照しようとして見つからずエラーになっていたと考えられます。

投稿2019/04/10 03:01

okkez

総合スコア87

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuuki0218

2019/04/10 05:54

なるほどですね!大分納得いきました! 確かにローカル環境で2.4.1/のディレクトリ名を変更したら想定通り起動に失敗しました。 実行RubyのバージョンディレクトリでGemが管理?されるというのは盲点でした...。 便利なライブラリを使った時に出るエラーは難しいですね...。 回答ありがとうございます。大変助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問