Background

最近工作上有需要在同一台機器上部署不同環境的程式碼,所以需要透過 direnv 來根據不同的資料夾載入不同的環境變數,以下是紀錄一下使用 direnv 要注意的地方。

Installaion

  • Mac OS
$ brew install direnv
  • Ubuntu
$ sudo apt-get install direnv

Setting

如果你使用 bash or zsh 記得到下面各自的檔案中加入指令。加入完之後記得重開 terminal 再使用 direnv。

  • bash

~/.bashrc

...
...

eval "$(direnv hook bash)"
  • zsh

~/.zshrc

...
...
	
eval "$(direnv hook zsh)"

Example

首先我們創造兩個不同的資料夾,接著給這兩個資料夾不同的環境變數,再來分別執行看看。

$ mkdir direnv
$ cd direnv
$ mkdir qa stg
$ touch qa/run.py qa/.envrc stg/run.py stg/.envrc
$ echo export ENV=testing > qa/.envrc
$ echo export ENV=staging > stg/.envrc
$ direnv allow qa 
$ direnv allow stg

run.py

import os
print(os.getenv("ENV"))
$ cd qa
direnv: loading .envrc
direnv: export +ENV
$ python3 run.py
testing
$ cd ../stg
direnv: loading .envrc
direnv: export +ENV
$ python3 run.py
staging

從上面的範例我們可以知道當我們到指定的資料夾時 direvn 會自動的讀取 .envrc 中的環境變數資訊。如果沒看到 direnv: loading .envrc & direnv: export +ENV 這兩個資訊則表示讀取失敗。

Advanced

那接著延伸出一個問題,那如果我不是在當下的資料夾執行 python 程式會發生什麼事?

$ cd direnv
$ python3 qa/run.py
None

我們可以看到執行結果為None,這表示 direnv 沒有 work,那接著我們嘗試

$ cd qa && python3 run.py
None
direnv: loading .envrc
direnv: export +ENV

同樣也是不成功,正確的執行方式是要透過 direnv 的指令來完成。

direnv exec [working_dir] python3 run.py

$ direnv exec /path/to/direnv/qa python3 run.py
direnv: loading .envrc
testing

執行完看到可以順利執行就大功告成了。

Reference