direnv – Linuxでプロジェクト固有の環境変数をスマートに管理する方法
direnvは、LinuxやmacOSなどのUNIX系オペレーティングシステムで利用できる、シェル向けの便利なオープンソース拡張ツールです。単一の静的実行ファイルとしてコンパイルされており、bash、zsh、tcsh、fishなど、主要なシェルを幅広くサポートしています。
direnvの主な目的は、~/.profileなどのシェル起動ファイルを汚すことなく、プロジェクト固有の環境変数を管理できるようにすることです。現在いるディレクトリに応じて環境変数を自動的に読み込み・解除する、新しい仕組みを実装しています。
SaaSアプリケーションの設計手法として知られる12factor(12ファクター・アプリ)における環境変数の読み込み、プロジェクトごとの隔離された開発環境の構築、デプロイ時に必要なシークレット情報の管理などに活用できます。さらに、rbenv、pyenv、phpenvのような複数バージョンのインストール・管理ソリューションを構築するためにも利用可能です。
direnvの仕組み
シェルがコマンドプロンプトを表示する前に、direnvは現在のディレクトリ(pwdコマンドで確認できるディレクトリ)とその親ディレクトリに.envrcファイルが存在するかどうかをチェックします。このチェック処理は非常に高速なため、プロンプト表示のたびに実行されていても体感できません。
.envrcファイルが適切な権限で見つかると、その内容はbashサブシェル内で読み込まれ、エクスポートされたすべての変数が取得され、現在のシェルで利用できるようになります。
Linuxへのdirenvのインストール
多くのLinuxディストリビューションでは、direnvパッケージがデフォルトのリポジトリで提供されているため、システムのパッケージマネージャーを使ってインストールできます。
$ sudo apt install direnv #Debian、Ubuntu、Mintの場合 $ sudo dnf install direnv #Fedoraの場合
Red Hat Enterprise Linux(RHEL)やCentOSなど、その他snapをサポートするディストリビューションでは、snapパッケージとしてインストールすることもできます。この場合、システムにsnapdがインストールされている必要があります。
$ sudo snap install direnv
direnvを各シェルにフックする方法
direnvをインストールしたら、現在使用しているLinuxシェルにフック(接続)する必要があります。たとえばBashの場合、以下の行を~/.bashrcファイルの末尾に追加します。
この設定は、rvmやgit-promptなど、プロンプトを操作する他のシェル拡張機能よりも後ろに記述するようにしてください。
eval "$(direnv hook bash)"
ZSHシェルの場合
以下の行を~/.zshrcファイルの末尾に追加します。
eval "$(direnv hook zsh)"
FISHシェルの場合
以下の行を~/.config/fish/config.fishファイルの末尾に追加します。
eval (direnv hook fish)
設定を反映させるには、開いているターミナルウィンドウを閉じて新しいシェルを起動するか、次のようにファイルを読み込み直します。
$ source ~/.bashrc $ source ~/.zshrc $ source ~/.config/fish/config.fish
Linuxシェルでのdirenvの使い方
direnvの動作を確認するために、tecmint_projectsという新しいディレクトリを作成して移動してみましょう。
$ mkdir ~/tecmint_projects $ cd tecmint_projects/
まず、コマンドライン上でTEST_VARIABLEという新しい変数を作成し、echoコマンドで値を表示してみます。まだ何も設定していないため、値は空になっているはずです。
$ echo $TEST_VARIABLE
次に、direnvによって読み込まれるBashコードを含む新しい.envrcファイルを作成します。echoコマンドと出力リダイレクト文字(>)を使って、「export TEST_VARIABLE=tecmint」という行を書き込みます。
$ echo export TEST_VARIABLE=tecmint > .envrc
デフォルトでは、セキュリティ機構により.envrcファイルの読み込みはブロックされます。今回は自分で作成した安全なファイルであることがわかっているので、次のコマンドを実行して内容を承認する必要があります。
$ direnv allow .
.envrcファイルの読み込みが承認されたので、先ほど設定したTEST_VARIABLEの値をもう一度確認してみましょう。
$ echo $TEST_VARIABLE
tecmint_projectディレクトリから出ると、direnvによる環境変数は自動的に解除(unload)されます。TEST_VARIABLEの値を再び確認すると、空になっていることがわかります。
$ cd .. $ echo $TEST_VARIABLE
以降は、tecmint_projectsディレクトリに移動するたびに、次のスクリーンショットのように.envrcファイルが自動的に読み込まれます。
$ cd tecmint_projects/
特定の.envrcファイルの承認を取り消したい場合は、denyコマンドを使用します。
$ direnv deny . #カレントディレクトリの場合 または $ direnv deny /path/to/.envrc
より詳しい情報や使用方法については、direnvのmanページを参照してください。
$ man direnv
また、direnvにはstdlib(direnv-stdlib)という標準ライブラリが付属しており、新しいディレクトリをPATHに簡単に追加できる関数をはじめ、さまざまな便利な機能が用意されています。
利用可能なすべての関数のドキュメントを確認するには、direnv-stdlibのmanページを参照してください。
$ man direnv-stdlib
以上がdirenvの紹介でした!ご不明な点や感想などがありましたら、ぜひフィードバックフォームからお聞かせください。
-
Rubyで環境変数を使う方法|ENVオブジェクトの操作から設定・Rails credentialsまで徹底解説
環境変数とは、次のような「キーと値」のペアとして表されるデータのことです。 KEY=VALUE この変数は、パソコン上で動くすべてのプログラム間で設定情報(コンフィグ)を共有するために使われています。 だからこそ、環境変数がどのような仕組みで動作し、Rubyプログラムから特殊な ENV オブジェクトを使ってどうアクセスするのかを学んでおくことが大切なのです。 環境変数の活用例 デフォルトエディターの設定 Rubyにgemの保存場所を伝える(GEM_PATH / GEM_HOME) APIキーをGitリポジトリにコミットすることなくアプリケーションへ渡す OSがバイナリファイル(Windo
-
Windows 10 で環境変数を設定・編集する方法を初心者向けに解説
環境変数とは、PC上で動作するプログラムの設定に使われるグローバルな値のことです。名前だけ聞くと難しく感じられますが、実際には「さまざまなアプリが共通して参照できる設定情報の保管場所」と考えると分かりやすいでしょう。 環境変数にはユーザーごとに紐づくものがあり、ユーザーアカウントが異なれば設定内容も変わります。その一方で、「%windir%」のようなシステム全体で共通の変数も存在します。たとえば「%windir%」は、Windowsがインストールされているディレクトリ(例:「C:\Windows」)を常に指します。アプリ側ではこの値を直接ハードコードせず、「%windir%」を参照することでW