direnvのインストールから動作確認までを解説

direnvのインストールから動作確認までを解説 サーバー

「ディレクトリ毎に環境変数を設定したい」
「特定のディレクトリ以下では、〇〇コマンドを実行したい」

このようなことが、direnvによって実現できます。
direnvを知らないと、エンジニアとしては損をしてしまいます。

本記事の内容

  • direnvとは?
  • direnvのシステム要件
  • direnvのインストール
  • シェルへのフック設定
  • direnvの動作確認

それでは、上記に沿って解説していきます。

direnvとは?

direnvは、シェルの拡張機能です。
既存のシェルに、次のような新機能を追加します。

「カレントディレクトリに応じた環境変数のロード・アンロード」

つまり、ディレクトリ毎に環境変数の設定が可能ということです。
地味ですが、便利な機能になります。

なお、公式上は「環境変数のロード・アンロード」が中心に説明されています。
具体的に表現すると、次の記述になります。

export FOO=foo
export HOGE=hoge

ただ、 direnvでは普通に次のようなコマンドも実行できます。

echo "出力もできる"
echo "ファイル作成もできる" > echo_test.txt

特にエラーや警告もありません。
そもそも、exportもコマンドですからね。

環境変数の設定以外でも、direnvの使い道はたくさんあります。
例えば、ログ出力としても利用できそうです。

以上、direnvについて説明しました。
次は、direnvのシステム要件を確認します。

direnvのシステム要件

現時点(2021年9月)でのdirenvの最新バージョンは、2.28.0となります。
この最新バージョンは、2021年3月12日にリリースされています。

direnvのシステム要件は、次の2つです。

  • Unix系OS
  • サポート対応シェル

Unix系OSとは、Linuxであれば基本的には問題ないでしょう。
macOSも対象になっています。

サポート対応シェルとは、以下。

  • bash
  • zsh
  • tcsh
  • fish
  • elvish

ここで各シェルの検索ボリュームを確認してみましょう。
Google Trendにおける検索ボリュームは、人気を測る指標として使えます。

なお、fishやelvishは対象外です。
そもそも、それらは検索ボリュームが出てきません。

やはりという結果になりました。
基本的には、bashさえ知っていれば十分と言えそうです。

個人的にも、bash以外を利用した記憶がありません。
知らない間に、利用している可能性は否定できませんけどね。

正直、利用しているシェル(CLI)が「bashだ!」とか意識しません。
「多分、bashなんでしょうね」ぐらいの認識です。

とにかく、direnvはLinuxであれば問題なく動くでしょう。
そして、大抵のディストリビューションでは、bashがデフォルトのシェルです。

よって、direnvのシステム要件はそれほど気にする必要はありません。

以上、direnvのシステム要件を説明しました。
次は、direnvをインストールしていきます。

direnvのインストール

direnvは各システム用にパッケージが用意されています。
以下が、direnvの対応しているシステムになります。

  • Fedora
  • Arch AUR
  • Debian
  • Gentoo go-overlay
  • NetBSD pkgsrc-wip
  • NixOS
  • macOS Homebrew
  • openSUSE
  • MacPorts
  • Ubuntu
  • GNU Guix

direnvは、広い範囲をカバーしています。
そして、今回はみんな大好きUbuntuでのインストールを説明します。

Ubuntuとdirenvのバージョン対応表は以下。

Ubuntu 16.042.7.0
Ubuntu 18.042.15.0
Ubuntu 20.042.21.2
Ubuntu 20.102.21.3
Ubuntu 21.042.25.2

Ubuntu 16.04の時代から、direnvはaptでインストール可能のようです。

では、Ubuntu 20.04 LTSにインストールしていきます。
まずは、パッケージの確認です。

$ sudo apt info direnv 
Package: direnv 
Version: 2.21.2-1 
Priority: optional 
Section: universe/utils 
Origin: Ubuntu 
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> 
Original-Maintainer: Punit Agrawal <punit@debian.org> 
Bugs: https://bugs.launchpad.net/ubuntu/+filebug 
Installed-Size: 3,751 kB 
Homepage: http://direnv.net/ 
Download-Size: 1,174 kB 
APT-Sources: http://archive.ubuntu.com/ubuntu focal/universe amd64 Packages 
Description: Utility to set directory specific environment variables 
 direnv is an environment variable manager for your shell. It knows 
 how to hook into bash, zsh and fish shell to load or unload 
 environment variables depending on your current directory. This 
 allows one to have project-specific environment variables and not 
 clutter the "~/.profile" file. 
 . 
 Before each prompt it checks for the existence of an ".envrc" file in 
 the current and parent directories. If the file exists, it is loaded 
 into a bash sub-shell and all exported variables are then captured by 
 direnv and then made available to your shell. 
 . 
 Because direnv is compiled into a single static executable it is fast 
 enough to be unnoticeable on each prompt. It is also language 
 agnostic and can be used to build solutions similar to rbenv, pyenv, 
 phpenv, ...

確かに、対応表の通りにdirenv 2.21.2がヒットしています。
インストールは、次のコマンドで行います。

$ sudo apt-get update
$ sudo apt-get install -y direnv

direnvのインストールは、すぐに終わります。

以上、direnvのインストールを説明しました。
次は、シェルへの設定(フック)を行います。

シェルへのフック設定

direnvが動作するためには、シェルにフックされる必要があります。
各シェルはそれぞれ独自の拡張機構を持っています。

つまり、それぞれ方法が異なりますということです。
その方法は、以下に記載されています。

シェル毎の設定
https://github.com/direnv/direnv/blob/master/docs/hook.md

bashの場合は、.bashrcファイルの最後に次の行を追加します。

eval "$(direnv hook bash)"

.bashrcについては、次の記事で解説しています。

フックの設定が完了したら、シェルを再起動することでdirenvが有効になります。

以上、シェルへのフック設定について説明しました。
最後は、direnvの動作確認を行います。

direnvの動作確認

最初に、ヘルプを確認しておきます。

$ direnv --help 
direnv v2.21.2 
Usage: direnv COMMAND [...ARGS] 
Available commands 
------------------ 
allow [PATH_TO_RC]: 
  Grants direnv to load the given .envrc 
deny [PATH_TO_RC]: 
  Revokes the authorization of a given .envrc 
edit [PATH_TO_RC]: 
  Opens PATH_TO_RC or the current .envrc into an $EDITOR and allow 
  the file to be loaded afterwards. 
exec DIR COMMAND [...ARGS]: 
  Executes a command after loading the first .envrc found in DIR 
help [SHOW_PRIVATE]: 
  shows this help 
hook SHELL: 
  Used to setup the shell hook 
prune: 
  removes old allowed files 
reload: 
  triggers an env reload 
status: 
  prints some debug status information 
stdlib: 
  Displays the stdlib available in the .envrc execution context 
version [VERSION_AT_LEAST]: 
  prints the version (2.21.2) or checks that direnv is older than VERSION_AT_LEAST.

主に利用するのは、以下。

  • allow
  • edit

それぞれを下記で説明します。
その前に、direnvの基本動作を確認しておきます。

direnvは、.envrcがないと何も始まりません。
.envrcへ該当ディレクトリ以下に適用したい処理を記述します。

direnvでは、上記のことが前提条件としてあります。

allow

例えば、「/home/ssh_test/test_dir」を対象のディレクトリとします。
「/home/ssh_test/test_dir」へ移動。

そして、viでもnanoでも何でもいいので.envrcを作成。

しかし、.envrcを作成しただけでは意味がありません。
「direnv allow」を実行しないと、direnvは機能しません。

そのことは、すぐに警告されます。

「direnv allow」を実行したら、次のように表示されます。

ちなみに、.envrcには以下を記述。

export TEST=testdesu

TEST変数がexportされたようです。
念のため、確認しておきます。

ちゃんと機能していますね。
では、「/home/ssh_test/test_dir」から抜け出します。

「/home/ssh_test」に移動したら、TEST変数が無効化されました。
「direnv: unloading」が、そのことを示しています。

edit

「direnv edit」は、.envrcの更新(新規・変更)と「allow」をまとめて行います。

「allow」での説明を理解していれば、上記の説明は不要でしょう。
「edit」は便利ですが、$EDITORにエディタ指定が必要です。

ヘルプには、以下の記載があります。

edit [PATH_TO_RC]:  
  Opens PATH_TO_RC or the current .envrc into an $EDITOR and allow  
  the file to be loaded afterwards.

$EDITORの指定は、上記でも出てきた.bashrcで行います。
.bashrcは、bashがシェルであることが前提です。

以上、direnvの動作確認を説明しました。

タイトルとURLをコピーしました