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