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を見に行ってエラーを出しているのか分からず。。
ご存じの方がいたら是非ご教示いただきたいです。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
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を参照しようとして見つからずエラーになっていたと考えられます。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.32%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2019/04/10 14:54
確かにローカル環境で2.4.1/のディレクトリ名を変更したら想定通り起動に失敗しました。
実行RubyのバージョンディレクトリでGemが管理?されるというのは盲点でした...。
便利なライブラリを使った時に出るエラーは難しいですね...。
回答ありがとうございます。大変助かりました!