Go言語(golang)でdirenvを使う
direnvは、ディレクトリに cd コマンドで移動することで、
そのディレクトリに環境変数をメッセージとともに自動的に設定してくれます。
Go言語で書かれていますが、python,node,ruby などでも使えます。
(python なら pyenv,venv の代わりに使うことができる)
Go言語の場合は、GOPATHに指定したディレクリに bin,pkg,src がありますが、
direnv を使えば、任意のディレクトリに別の bin,pkg,src を置くことができます。
以下に、.envrc のファイル内で使えるコマンドが載っています。
https://github.com/direnv/direnv/blob/master/man/direnv-stdlib.1.md#stdlib
(その他にも、.envrc にシェルスクリプトも記述できる)
目次
インストール
以下にプラットフォームごとのインストール方法が書いてあります。
(*nix系で、シェルは bash, zsh, tcsh, fish, elvish に対応していると書いてあります)
https://github.com/direnv/direnv/blob/master/docs/installation.md
インストール後に、以下を .bashrc に追記しておく
eval "$(direnv hook bash)"
.bashrc にエディタを設定していない場合は、direnv edit
で使用するエディタを
export
で設定しておくと、direnv: $EDITOR not found.
のようなエラーが起きない。
export EDITOR="vim"
基本的な手順
- ディレクトリを作成し、そこへ移動する
$ mkdir project && cd $_
- .envrc を作成してエディタで編集する(
export EDITOR
で設定したエディタ)
$ direnv edit .
.envrc ( #
でコメントが書ける )
layout go export GOPATH=$(pwd) export GO111MODULE=on # go mod を使う場合はこれをつける
他に .envrc 内で使うことができる命令は、以下に書いてあります。 https://github.com/direnv/direnv/blob/master/man/direnv-stdlib.1.md#stdlib
シェルスクリプトが書けるので以下のように試してみれば分かると思います。
echo $(expand_path ../project) path_add PROJECT_BIN bin echo $PROJECT_BIN
保存すると以下のようなメッセージが出るはず。これで環境変数が設定される
direnv: loading .envrc direnv: export +GO111MODULE ~GOPATH ~PATH
以降は、ディレクトリ配下で go get
などした場合は、
pkg ディレクトリが作成され、そこにダウンロードされるようになる。
- 確認
$ ls -a .envrc // ディレクトリを作成して、そこへ移動 $ mkdir -p src/hello && cd $_ // Goのファイルを作成 $ vim hello.go package main func main() { println("hello") } // コンパイルして bin にバイナリを置く $ go install hello.go // ちゃんと動作してれば、bin ディレクトリにバイナリがある $ ../../bin/hello hello
ディレクトリを抜けるとメッセージとともに環境変数の設定が解除される
direnv: unloading
以下のエラーが出る場合は、自明ですが $ direnv allow
する
direnv: error .envrc is blocked. Run direnv allow to approve its content.