direnv - ディレクトリごとに環境変数を設定できるコマンドラインツール

S 20180807 154946

macOSやLinuxなどUNIX系のOSでは、環境変数は基本的には.bashrcや.zshrcなどで設定し、シェルを起動すると常に同じ値が適用されます。

通常はこれで問題ありませんが、場合によってはディレクトリごとに固有の環境変数を設定したい場合があるかもしれません。例えばソフトウェアのプロジェクトフォルダ内でだけ、環境変数としてAWSの認証キーを設定して使用したい場合などです。

今回紹介する「direnv」はそのような場合に便利な、コマンドラインツールです。

ディレクトリ内にに.envrcという設定ファイルを作成しておくと、そのディレクトリに移動したタイミングで、.envrcの中身が評価され環境変数が自動的に設定されます。またディレクトリの外に移動すれば、その環境変数は削除されます。

以下使用方法を説明します。

direnvのインストール

macOSの場合Homebrewでインストールするのが簡単です。

brew install direnv

それ以外の環境の場合GitHubのリリースページからダウンロードできる実行ファイルを利用するのが簡単です。

次に自分が使用しているシェルの設定ファイルを編集します。

bashの場合は~/.bashrcに以下を追加します。

eval "$(direnv hook bash)"

zshの場合は~/.zshrcに追加します。

eval "$(direnv hook zsh)"

そのほかfish、tcsh、elvishでも使用することが可能です。詳細は公式サイトに掲載されています。

direnvの使用方法

direnvでは指定フォルダ内でだけで有効な環境変数を設定することができます。

これを確認するために、適当なフォルダ「~/project」でdirenvの設定ファイル「.envrc」を作成して、環境変数FOOに値"xyz"を設定してみます。

$ mkdir ~/project
$ cd ~/project
$ echo "export FOO=xyz" > .envrc
export FOO=xyz .envrc
$ direnv allow .
direnv: loading .envrc
direnv: export +FOO
$ echo $FOO
xyz

この状態で別のフォルダ、例えば親フォルダに移動するとFOOが消えます。

$ cd ..
direnv: unloading
$ echo $FOO

再度「~/project」フォルダに移動するとFOOに"xyz"が設定されます。

$ cd ~/project
direnv: loading .envrc
direnv: export +FOO
$ echo $FOO
xyz

適当な環境変数では意味がありませんが、例えばAWSを使用するためのAWS_ACCESS_KEY_IDや、AWS_SECRET_ACCESS_KEYをプロジェクト内の.envrcに記述し、プログラム内からこれら環境変数を参照するようにすれば、ソースコード内に認証情報を直書きすることを避けることができます。

また.envrcの中ではdirenvが準備してくれている便利な各種関数を使用することも可能です。「direnv stdlib」を実行すると、どのような関数が定義されているのか確認できます。

stdlibにはフォルダ直下の.envrcではなく、上の階層に遡っていける「source_up」や特定のディレクトリやファイルを指定できる「source_env」など便利な機能が満載です。direnvをさらに使いこなしたい場合確認することをおすすめします。

ターミナル派なら便利

direnvを利用すればフォルダ内だけで有効な環境変数を設定できるため、ソースコードに埋め込まれた認証情報を.envrcに切り出して安全に運用することが可能です。

ただし統合開発環境を利用する場合、direnvに直接対応した開発環境は少ないと思いますので、プラグインを探すなどなんらかの工夫が必要になると思います。

スポンサーリンク