関係 RubyGems、Ruby バージョン、バンドラー バージョン、RVM および Capistrano の競合

概要

Capistrano インストール プロセスを使用する古い Ruby on Rails プロジェクトがあります。現在、Ruby 2.5.1 と Rails 5.2 が実行されています。私は更新バージョンの開発に取り組んでいますが、そうしている間に古いインストールが台無しになってしまった可能性があります。現時点では、新しい状況に移行する前に、Capistrano デプロイメント プロセスを修復して修正プログラムをインストールする必要があります。

私は RVM を使用して、さまざまな Ruby バージョンを管理します。

私のローカルマシンでは、アプリは Ruby 2.5.1、gem 3.2.3、bundle 1.17.3 を使用して正常に動作します。これは、Gemfile.lock に記載されているバンドルのバージョンでもあります。

サーバー上には、ruby 2.5.1、gem 2.7.6、バンドル 1.16.1 があります。 (rvm もインストールされています。) デプロイ時に、「rubygems.rb:289:in ‘find_spec_for_exe’: can’t find gembundler (>= 0.a) with executable Bundle (Gem::GemNotFoundException)」というエラー メッセージが表示されます。実際、現在のディレクトリ (まだ実行中のソフトウェアのバージョン) で gem list バンドルを実行すると、バンドルの現在のバージョンが 1.16.1 であることがわかります。ただし、現在実行中のソフトウェアのバージョンの Gemfile.lock には、1.17.3 にバンドルされていると記載されています。

実際にはバンドル 1.17.3 が (/home/deploy/.rvm/gems/ruby-2.5.1/gems/ に) インストールされていないように見えるため、おそらくサーバーにバンドル 1.17.3 をインストールする必要があると思います。ただし、実行中の運用サーバーにインストールを開始する前に、自分が何をしているのかを明確にする必要があると思うので、質問します。

最後に、私はいつも混乱してしまうので、さらに詳しく説明します。

解決策

RubyGems は、Ruby とともにインストールされるライブラリ (Ruby コードの束) です。このライブラリを使用すると、Gem をインストールすることができ (gem install something)、プログラムからそれらの gem をロードすることもできます (「some_gem」が必要)。要約すると、これは gem と gem エコシステムに付属するすべてのもの (インストール、管理、使用法) を利用できるようにするコードの束です。

物理的には、RubyGems コードはここにあります。 https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https://github.com/rubygems/rubygems

そのリポジトリの説明を読むことができます。

gem は、上で参照した RubyGems ライブラリ コードを人間が操作できるようにするコマンドです。

それ以上でもそれ以下でも複雑ではありません。 gem コマンドを実行すると、Ruby インストールから RubyGems ライブラリ コードがロードされます (GitHub でコードを見つける場所を示したばかりです)。次に、gem コマンドは、リクエスト (gem の削除、gem のインストール、gem に関する情報のクエリなど) を満たすために、このライブラリ内の適切なメソッドを呼び出します。

Bundler と Bundle コマンドに違いはありません。 Bundler もコードのライブラリであり、bundler はこのコードとインターフェイスするためのコマンドですが、RubyGems のようにシステム全体で gem をインストールおよび管理するのではなく、Bundler を使用するとプロジェクト ベースでのみ gem を管理およびインストールできます。 。したがって、Bundler はプロジェクトから独立した gem マネージャーのようなものだと考えてください。これは、システム全体の gem マネージャーである RubyGems とは対照的です。