13日目 遠回りしながらRailsインストール[JRuby 9.1.17]⑥

おはようございます。
昨日のRailsインストールの続きです。(昨日の記事はこちら)

JRuby 9.1.17に対して、Railsをインストールするために、Railsのバージョンと関連するGemのバージョンの組み合わせは以下なら上手くいきそうというあたりを付けることはある程度できたので、その条件で改めてRailsごと「bundle install」を用いてインストールしようと思います。

・Rails 4.2.4
・bundle 1.17.3
※上記はJRuby 9.1.17の場合

Bundlerのバージョンを指定しての「bundle install」

現在、私のPCでは以下の2つのバージョンの「bundler」がインストール済です。
・bundle 1.17.3
・bundle 2.3.15

対象とするのは、1.17.3ですので、以下の記事を参考にバージョンを指定してインストールの実行を試みます。

例えば、今回の場合はJRubyを使うので、先頭に「jruby -S」を付けて、

jruby -S bundle _1.17.3_ install

というコマンドで、インストール可能です。

Railsごと「bundle install」を実施する場合

さあ、インストールするぞ!と思ったのですが、たまたま以下の記事を見つけました。以下の記事の中で「Railsアプリを作るとき」という見出しで書かれた箇所がありましたが、今回の場合と当てはまったので、その内容を紹介したいと思います。

実は、Gemfileの作り方は以下のように主に2通りありますが、
①「bundle init」コマンドでGemfileの雛形作成
②「rails new」コマンドでrailsアプリ作成時と一緒にGemfileを生成(「bundle install」も同時実行)

前者の①を実行する際に、作り方によってはGemfileを2回ほど自動的に上書きすることになり、「bundle install」も2回ほど実行されて、どう変わったか変更内容を追っていくのがかなりややこしくなってしまいます。

例えば以下のように

bundle init

を実行して、Gemfileを生成した後にGemfileから
# gem rails
と記述されている行の#を外してGemfileを保存した後に、

bundle install --path vendor/bundle

を実行して、最後にrailsを生成するために、

bundle exec rails new .

とコマンドを入力した場合、Gemfileを上書きしようとしますが、同時に「bundle install」も自動的に実行されてしまいます。そのため、Gemfileがどんな内容になっていて、そして、その内容に従って「bundle install」が行われていたかどうか、自分の中で理解・把握することが難しくなります。

そのため、変更されている「Gemfile」の内容をしっかりと追って把握しつつ、「bundle install」のタイミングをコントロールしたい場合、上記コマンドにオプションを加える必要があります。

そのため、先ほど載せた上の記事によれば、最後にrailsを生成する際には、以下のように「bundle exec rails new .」の末尾に「--skip-bundle」を付けることによって、rails生成はしますが、先ほどと違って自動的に「bundle install」は行わないようにします。

bundle exec rails new . --skip-bundle

そうすれば、Gemfileは上書きされて変更はされるものの、変更後の「bundle install」は自動的に実行されないため、Gemのインストールを自分自身のタイミングで行うことができるようになります。

あとは、上書きされて変更された後のGemfileを確認しつつ、変更・追記などが必要だったら、Gemfileを編集して、それで、改めてGemをインストールし直す(アップデートする段階)になったら、最後に以下を実行します。

bundle update

上記のように行うことによって、「bundle init」コマンドで生成しながら、次第に自動的に変更されていくGemfileの内容を追いながら把握できて、時には必要に応じてGemfileを編集し、「bundle install」⇒「rails new」⇒「bundle update」を経て、アプリに必要な各種Gem、バージョンをしっかりと管理できるようになります。

余談:「--path vendor/bundle」

前章にて、以下のコマンドについて、

bundle install --path vendor/bundle

「--path vendor/bundle」の説明を省いていましたが、その箇所については、以下の記事が参考になります。

上記の記事によると、「--path vendor/bundle」を付けるときと付けない時の違いは以下の通りになるようです。

・「--path vendor/bundle」を付けた時
⇒Gemは「vendor/bundle」配下(Railsアプリのプロジェクトデータ内)にインストールされる

・「--path vendor/bundle」を付けない時
⇒GemはローカルのPC内にまとめてインストールされる
※わたしのPCの環境(Windows 10)の場合、JRuby 9.1.17は「C:\jruby-9.1.17.0」にインストールされていますが、「--path vendor/bundle」を付けないと、以下の写真のように、

「C:\jruby-9.1.17.0\lib\ruby\gems\shared\cache」というように、jrubyをインストールした場所の下にインストールされるようです。

「--path vendor/bundle」を付けたほうが良い場合というのは、複数人でプロジェクトに取り組むときなどであり、理由としては、以下のように、バージョンがごちゃごちゃにならないようにできるからだそうです。

なぜ --path vendor/bundle オプションをつけた方が良いか
--path vendor/bundle オプションをつけ、ローカルではなくプロジェクト内にインストールすることで、ローカルに複数バージョンのgemがインストールされてごちゃごちゃになってしまうことを防げます。

haayaaa’s diary 2019-01-21
https://haayaaa.hatenablog.com/entry/2019/01/21/160504

わたしも、できればアプリごとに必要なGemとバージョンを分けたほうが良いと思いますので、今までは「--path vendor/bundle」を知らないで使っていたのですが、「--path vendor/bundle」を付けようと思いました。

ただし、最近の「bundler」については、「--path vendor/bundle」を付けるのは非推奨になったそうです。

ですが、上の記事では、rubyとbundlerのそれぞれのバージョンが
ruby:2.6.5
bundler:2.1.2

であり、今回、わたしが対象とするrubyとbundlerのそれぞれのバージョン
ruby: 2.3.3 (※jruby 9.1.17.0と対応)
bundler: 1.17.3
と比べて新しいため、「--path vendor/bundle」が非推奨という話は、今回の場合は気にしなくて大丈夫かと思います。
そのため、そのまま「bundle install」の末尾に「--path vendor/bundle」を付ける方向性で行います。(実際にコマンドプロンプトから、上記のコマンドを打ってみて、[DEPRECATED]などのメッセージが出なければ大丈夫だと思います。

おわりに

色々と「bundle install」を用いてRailsごとインストールするための手順がわかったので、今度の今度こそインストールしようと思いましたが、記事が長くなったので、この辺りにします…。

今回も読んでくださってありがとうございました。
次のターンへ続きます。

この記事が気に入ったらサポートをしてみませんか?