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

允許它套用環境變數。