はじめに
※windowsのローカル環境下です。※表題の通り、気になったので調べました。
bin/railsで実行するかrailsで実行するか??
まずは事前知識として、bin/railsで実行するかrailsで実行するか??結論、どちらを使っても基本問題ないですが、参照元が違います。
binをつけるとプロジェクトディレクトリを参照。
binを付けないとローカル(グローバル)のrailsを参照。
続いて本題。
gemでインストールしたrailsコマンドがなぜ使えるのか??
→これはとても浅い勘違い!!
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
ちなみにrails new時デフォルトでbundle installも実行されますが、Bオプションを付けることで実行スキップできます。
rails new rails_app -B
一度オプションを付けてインストールすれば、以下に設定が保存されて以降は指定不要。
プロジェクト/.bundle/config
---
BUNDLE_PATH: "vendor/bundle"
参考
Rails 4.1以降のコンソールコマンドは必ず bin/ を付けなきゃいけないの?railsでbundle installする時にインストールパスを指定