golangの日記

Go言語を中心にプログラミングについてのブログ

Go言語(golang)でdirenvを使う

golang.png


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"



基本的な手順


  1. ディレクトリを作成し、そこへ移動する
  $ mkdir project && cd $_



  1. .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 ディレクトリが作成され、そこにダウンロードされるようになる。



  1. 確認
  $ 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.