direnv を使った環境変数の管理

以前、Node.jsで環境変数を管理する方法として、dotenvについて書いた。

numb86-tech.hatenablog.com

だがdirenvを使えばもっと簡単に環境変数を管理できることを知った。

github.com

この記事の内容はmacOS10.13.5で動作確認している。

セットアップ

homebrewを使っていれば非常に簡単に出来る。

  1. homebrewでインストール
  2. ~/.bashrceval "$(direnv hook bash)"と書き込む
  3. 書き込んだ内容を反映させる
$ brew install direnv
$ cat >> ~/.bashrc
eval "$(direnv hook bash)"
^C
$ source ~/.bashrc

これで使えるようになった。

使い方

.envrcに、使いたい環境変数を書いていく。
書き方はexport 環境変数名=値
こうすると、.envrcが置いてあるディレクトリ以下でその環境変数を使えるようになる。

例として、値がhoge環境変数HOGEを設定してみる。

まず、HOGEが存在しないことを確認。

$ echo ${HOGE-nope}
nope

次に、.envrcを作成してexport HOGE=hogeと書き込む。
.envrcを作成したり編集したりするとエラーが出ることがあるので、そのときは$ direnv allowを実行する。

$ echo export HOGE=hoge > .envrc
direnv: error .envrc is blocked. Run `direnv allow` to approve its content.
$ direnv allow
direnv: loading .envrc
direnv: export +HOGE

これでHOGEを使えるようになったはずなので、確認してみる。

$ echo ${HOGE-nope}
hoge

対象となるのは.envrcが置かれているディレクトリ以下なので、他の場所には影響を与えない。

$ cd ../
direnv: unloading
$ echo ${HOGE-nope}
nope

下の階層にも.envrcを置けばその内容が採用される。
上位にある.envrcは無視される。

試しにまず、先程の.envrcFUGAを追加してみる。

$ echo export FUGA=fuga >> .envrc
direnv: loading .envrc
direnv: export +FUGA +HOGE
$ echo ${HOGE-nope}
hoge
$ echo ${FUGA-nope}
fuga

ディレクトリに移動してみるが、親ディレクトリにある.envrcの内容が使われている。

$ mkdir child && cd child
$ echo ${HOGE-nope}
hoge
$ echo ${FUGA-nope}
fuga

ディレクトリに.envrcを作成しFUGAについて設定する。
そうすると、その内容が反映される。

$ echo export FUGA=child > .envrc
direnv: error .envrc is blocked. Run `direnv allow` to approve its content.
$ direnv allow
direnv: loading .envrc
direnv: export +FUGA
$ echo ${FUGA-nope}
child

ではHOGEはどうなっているのかというと、存在しないことになっている。

${HOGE-nope}
nope

つまり、子ディレクトリにある.envrcが採用され、親ディレクトリの.envrcは無視される。

プログラムからの利用

.envrcに書いてあるものは他の環境変数と同じように扱われるので、プログラムのなかで問題なく取得することが出来る。
dotenvと違ってnpmモジュールをインストールする必要がないし、言語をまたがって使用することが出来る。

例として、Node.jsとRubyで使えることを確認してみる。
それぞれ以下の内容で、test.jstest.rbというファイルを作る。

console.log(process.env.SHELL);
console.log(process.env.HOGE);
puts ENV['SHELL']
puts ENV['HOGE']

確認のため、.envrcを削除して環境変数HOGEが存在しない状態に戻す。
この状態でそれぞれのプログラムを実行すると、最初から設定されているSHELLは取得できるが、HOGEは取得できない。存在しないので当然だが。

$ rm .envrc 
direnv: unloading
$ echo ${HOGE-nope}
nope
$ node test.js
/bin/bash
undefined
$ ruby test.rb
/bin/bash

HOGEを用意した上でプログラムを実行すると、正しく取得できていることが分かる。

$ echo export HOGE=hoge > .envrc
direnv: loading .envrc
direnv: export +HOGE
$ echo ${HOGE-nope}
hoge
$ node test.js
/bin/bash
hoge
$ ruby test.rb
/bin/bash
hoge

Gitの管理から外す

環境変数にはアクセスキーなどのセンシティブな内容を入れることが多いはずなので、.gitignoreで指定するなどして、慎重に管理する。

『Webプログラミングが面白いほどわかる本 環境構築からWebサービスの作成まで、はじめからていねいに』を読んだ

N高等学校のプログラミング学習教材の一部を書籍化したもの。
N高のプログラミングコースがすごいというのは聞いていたし、「Webアプリケーションフレームワークを学ぶ際にそのチュートリアルでやろうとしている操作や背景にある技術がわかる本」という切り口にも興味を持ったので、読んでみた。

www.kadokawa.co.jp

400ページ以上あるが全ページフルカラーであることに、まず驚いた。
カラフルであり1ページあたりの情報量も少ないので、技術書というより通信教育のテキストのような雰囲気がある。
内容も、技術について掘り下げて説明していくことより、とにかく読み手に伝えること、分かってもらうことに力点を置いている印象を受けた。いい意味で割り切ってある。

扱う題材も広く浅くという感じで、プログラミングをしていく上で押さえておくべき知識を網羅的に紹介してある。
簡単なコマンドラインの操作から始まり、vimシェルスクリプト、ネットワークの基礎やサーバーとクライアントという概念、GitとGitHub、などを学んでいく。

後半ではNode.jsを使ってプログラミングをしていくが、プログラミング言語の文法などにはほとんど触れない。
登場するコードについては丁寧に説明してあるが、それだけであり、何らかのプログラミング言語について学びたいと思って本書を読むと、期待を裏切られると思う。

だが言語についての情報はネットでいくらでも身につけられるし、入門書も山程ある。必要に応じて自分で調べることも難しくない。
プログラミング入門者がまず身につけるべきなのは、本書が教えてくれるような「ウェブプログラミングの全体像」だと思う。

一つ一つについて深掘りしているわけではないのだが、そもそも存在や概要を知らなければ自分で調べることも出来ないのだから、まずは取っ掛かりを掴むことが大切だ。まずは概要を知って、あとは必要に応じて自分で調べていけばいい。
本書を読むことで、そのための土台を得られると思う。

一貫して「実際に手を動かす」ことを重視しているのも素晴らしい。
曖昧な説明や「あとで自分で試してみてください」で逃げず、動くものを作るためのサンプルや手順を必ず示してくれる。

些細なことであっても、説明だけで終わらせることがほとんどない。
実際に動くものを作れるというのはとても大切で、これがないとイメージしにくい。

ネットワークの説明では、nctelnetといったコマンドを使って実際に通信を体験できる。

アルゴリズムの変更によるパフォーマンスの改善も、簡単にではあるが触れられている。実際にコードを書いて、実際に計測して、結果を見せている。
本書の内容だけでアルゴリズムへの理解が深まったり、パフォーマンスに関するテクニックが身に付くわけではない。だが、同じ機能でも書き方によってパフォーマンスが大きく変わるということを実際に体験できることが、重要なのだ。

そしてその説明も、非常に分かりやすい。
技術書では「これくらい分かるでしょ」で説明やコードを省略されることがよくあるのだが、本書ではそのようなことは一切なく、必要な操作をしつこいくらい丁寧に説明してくれる。

最初に仮想環境にUbuntuをインストールし、それを実行環境にするので、誰でも同じ環境で本書の内容を実践していけるようになっている。

ネットのハウツー記事でプログラミングを触ってみて、ちゃんと勉強してみようかなと思った人が最初に読むべき本だと思う。
ものすごく丁寧に、ウェブプログラミングの世界に入門させてくれる。門をくぐった後は、自分で好きな道を進んでいけばいい。