[Ruby] 利用binstubs省略bundle exec
1. bundle binstubs
在Ruby中我們可以使用Bundler來管理專案的套件和版本,為了確保執行rake等指令時,能使用Gemfile一致的設定,我們通常會使用bundle exec作為開頭來執行指令,例如:
$ bundle exec rake db:migrate
不過每次都要打bundle exec顯得有些麻煩,這時候我們可以利用bundle的binstubs來解決這問題。
例如我們想產生rake的binstubs,輸入
$ bundle binstubs rake
會在專案下的bin資料夾產生rake的script,這時候執行
$ ./bin/rake
就相當於
$ bundle exec rake
如果想產生全部binstubs,可以執行
$ bundle install --binstubs
不過不建議這樣做,他會在該目錄下產生.bundler的設定值,之後只要執行bundle install都會重新產生binstubs,如果有使用spring之類的套件會被覆蓋掉。
2. 環境變數
產生了binstubs之後還是要多打./bin/的路徑,這時候我們可以將相對路徑./bin加到環境變數來解決,以Mac為例可以修改.bash_profile,
$ vi ~/.bash_profile
加入
export PATH="./bin:$PATH"
之後在有產生binstubs的專案下就可以直接執行rake指令了,必須加在最前面讓他優先被找到。
3. direnv
如果有使用rvm的版本管理系統,直接加入環境變數會被覆蓋掉,我門可以利用direnv的程式來幫我們針對資料夾設定自己的環境變數。首先利用brew安裝:
$ brew install direnv
接著加入以下設定到.bash_profile
eval "$(direnv hook bash)"
接著在專案資料夾下增加.envrc的檔案,寫入
PATH_add bin
之後進入這個資料夾就會套用這個環境變數,第一次進入可能會看到錯誤訊息:
direnv: error .envrc is blocked. Run `direnv allow` to approve its content.
依據他的提示輸入
$ direnv allow
允許它套用環境變數。