gemでインストールしたrailsコマンドがなぜ使えるのか??


はじめに

※windowsのローカル環境下です。※

表題の通り、気になったので調べました。

bin/railsで実行するかrailsで実行するか??


まずは事前知識として、bin/railsで実行するかrailsで実行するか??

結論、どちらを使っても基本問題ないですが、参照元が違います。

binをつけるとプロジェクトディレクトリを参照。

binを付けないとローカル(グローバル)のrailsを参照。

続いて本題。

gemでインストールしたrailsコマンドがなぜ使えるのか??


railsコマンドはローカル環境変数でPath通してるはず。。。

→これはとても浅い勘違い!!

railsは以下のようにgemでインストールしています。

$ gem install rails -v "5.2.3"
$ rails -v
Rails 5.2.3

では、なぜgemでインストールしたrailsでrailsコマンドが通るんだろう??

調べました。

環境変数には以下があります。

C:\Ruby26-x64\bin

ここを確認するとこんな感じ。
$ ls Ruby26-x64/bin
_guard-core*             coderay.bat  nokogiri*     rails.bat  ruby_builtin_dlls/  spring*
_guard-core.bat          erb*         nokogiri.bat  rake*      rubyw.exe*          spring.bat
bundle.cmd               erb.cmd      pry*          rake.bat   sass*               sprockets*
bundler.cmd              gem*         pry.bat       rake.cmd   sass.bat            sprockets.bat
byebug*                  gem.cmd      puma*         rdoc*      sass-convert*       sqlite3.def
byebug.bat               guard*       puma.bat      rdoc.cmd   sass-convert.bat    sqlite3.dll*
chromedriver-helper*     guard.bat    pumactl*      ri*        scss*               thor*
chromedriver-helper.bat  irb*         pumactl.bat   ri.cmd     scss.bat            thor.bat
chromedriver-update*     irb.cmd      rackup*       ridk.cmd   setrbvars.cmd       tilt*
chromedriver-update.bat  listen*      rackup.bat    ridk.ps1   slimrb*             tilt.bat
coderay*                 listen.bat   rails*        ruby.exe*  slimrb.bat          x64-msvcrt-ruby260.dll*

railsがありました。これを参照しているっぽい。

ですが確証が得られないのでさらに調べる。

gemsでインストールした各種ライブラリは以下にあります。

C:\Ruby26-x64\lib\ruby\gems\2.6.0\gems

rails 5.2.3の中身を確認
$ ls Ruby26-x64/lib/ruby/gems/2.6.0/gems/rails-5.2.3
README.md

あれ??どうやって参照している??

whichコマンドを使ってみる。

$ which rails
/c/Ruby26-x64/bin/rails

解決しました◎

やはりRuby直下のbinディレクトリでrailsは参照されていました。

ちなみに、なんで参照されるか。。。

どうやらwhichコマンドは以下のルールらしい。

whichコマンドは、環境変数のPATHに設定されているディレクトリ順に調べ、最初に見つかったコマンドを表示

whichコマンドがこのような参照方法であればコマンドもそうであるはず!!

合点✌

備考:bundle installする際にパスを指定する


指定しないで実行すると前述のとおり、以下にインストールされます。
C:\Ruby26-x64\lib\ruby\gems\2.6.0\gems

パスを指定する方法は以下
bundle install --path vendor/bundle

これでプロジェクト直下のvendor/bundleにインストールできます。

ちなみにrails new時デフォルトでbundle installも実行されますが、Bオプションを付けることで実行スキップできます。

rails new rails_app -B

一度オプションを付けてインストールすれば、以下に設定が保存されて以降は指定不要。

プロジェクト/.bundle/config

---
BUNDLE_PATH: "vendor/bundle"

参考


Rails 4.1以降のコンソールコマンドは必ず bin/ を付けなきゃいけないの?

コマンドの場所を調べるには

railsでbundle installする時にインストールパスを指定

おわりに


日ごろからローカル環境の扱いにはもっと意識を向けていきたいと思いました。