最強の環境切り替えツール2015
様々な事情から、同一のマシンに複数の環境が混在することはよくある。Rubyを使っていてもあるプロジェクトは2.1系だが、あるプロジェクトは1.8系じゃないと動かないみたいなパターンだ。また、プロジェクトごとに環境変数を設定したり、書式設定をしたりすることもある。そういった環境の混在をうまくさばくためのツールを導入しよう。
- direnv
- anyenv
- editorconfig
異論・反論・ほかに導入すべきツールなどがあれば是非ともコメントしてほしい。
direnv
direnv はディレクトリ単位で環境変数を切り替えることができる。よく使われる用途としてはパスワードを安全に保持する、言語の環境を整えるなどである。
インストール
Macでのインストールならば簡単だ。
$ brew install direnv
ソースからインストールする場合にはGolangが必要になる。
git clone https://github.com/direnv/direnv
cd direnv
make install
実行バイナリをインストールするだけではインストールは完了しない。direnvは仕組み上シェルのcdコマンドを乗っ取る形なので、シェル上でインストールするためのコマンドを実行する必要がある
eval "$(direnv hook bash)"
bash の場合は、上記コマンドを ~/.bashrc に記述する。ほかにもtcsh, zsh, fish などにも対応している。詳細は公式を見てほしい。
gitで無視したい
direnv では設定ファイル .envrc
を各ディレクトリに作成するため、gitには.envrc
を無視するように設定したい。
vi `git config --get core.excludesfile`
このファイルに.envrc
を追加するといいだろう。
使い方
$ cd ~/hoge
$ echo 'export PASSWORD="password"' > .envrc
$ direnv allow .
こうしておけば、~/hoge のディレクトリに移動した場合のみ、環境変数にPASSWORDが設定される。もちろんPATH環境変数をいじることも可能だ。
秘密情報を環境変数で受け渡しすること
たとえばウェブアプリを作ったりする場合、DBの接続情報などを設定ファイル(と、称したDSL, ソース, YAML, JSON, ini)などを置くケースは多い。ただ、これには問題があってVCSで管理下におくべきかどうか、ファイルが混ざる危険、インストールが面倒になったりなどの問題がある。
そこで設定情報は環境変数に切り離そう。direnvを使わずに環境変数を設定する方法もあるし、PaaSなどでは秘密情報を環境変数に設定できるものもよくある。
あるいはちょっとしたスクリプトを書くときに、ついついスクリプトに直接パスワードを書いてしまう人はいないだろうか?パスワードを環境変数に分離する癖をつけておけば事故の可能性は減る。
anyenv
direnvが汎用的な環境切り替えツールだとしたら、anyenvは言語の環境切り替えに特化したツールだ。anyenv自体には言語の切り替え能力はなく、実際に切り替えをする個別のツールを管理するためのツールなのだ。
$ anyenv install ndenv
$ ndenv install v4.0.0
$ ndenv global v4.0.0
最初のanyenv install ndenv
で、Nodeを切り替えできるndenv
をインストールする。次のndenv install v4.0.0
でnode 4.0.0をインストールし、ndenv global v4.0.0
でグローバルで使うNodeを4.0.0に設定する。
direnvでも言語の切り替えはやろうと思えばできるが多少面倒だしできることはanyenvの方が多いのでdirenvを使ってる人でもanyenvがおすすめだ。
公式などを確認してほしいが、R言語, Crystal, Erlang, Elixir, Haskell, D言語, Java, Lua, Node, PHP, Perl, Python, Ruby, Go, Scala(sbt/scala) などに対応している。
インストール
$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.your_profile
$ echo 'eval "$(anyenv init -)"' >> ~/.your_profile
$ exec $SHELL -l
$ mkdir -p $(anyenv root)/plugins
$ git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update
$ git clone https://github.com/znz/anyenv-git.git $(anyenv root)/plugins/anyenv-git
your_profileは、bashユーザーならbash_profileなどと読み替えてほしい。
EditorConfig
プロジェクトでインデントについてもめることはないだろうか?EditorConfigを使えば、たとえばプロジェクトごとにインデントなどのルールを統一することができる。
EditorConfigは、.editorconfigという設定ファイルの書式とファイルの扱いに関する規定(プロトコル)と、各種エディタの実装の二つによって成り立っている。よくある使われ方は~/.editorconfig
に全体的な設定を記述しておき、個別のプロジェクトごとに.editorconfig
を設定するパターンだ。
インストール
EditorConfig対応のエディタを使うか、プラグインなどを導入すればいい。公式にアクセスすると、たとえばIntelliJ IDEA ならばプラグインを入れるまでもなく対応しているとわかるし、SublimeTextならばプラグインが存在していることがわかる。