読者です 読者をやめる 読者になる 読者になる

YAMAGUCHI::weblog

土足で窓から失礼いたします。今日からあなたの息子になります。 当年とって92歳、下町の発明王、エジソンです。

Goのレポジトリ管理をするgenvというものを作りました

はじめに

こんにちは、Go界の宮口精二です。今年も残すところあと2日となりましたが、皆さんいかがお過ごしでしょうか。さて、今年の後半は折にふれてGoを触っていたわけですが、日頃Goでコードを書く上で煩わしい作業がいくつかあったので、それを軽減するツールを作ってみました。

genv

Goのワークスペース管理をするためのコマンドgenvと、そのサポートスクリプトのgenvwrapper.shです。サポートスクリプトはbash/zshのみ対応しています。*1
またWindows版を作りたいんですが、環境が手元にありません。一応genv自体はGoで実装していて、パス名あたりはfilepathでちゃんと扱ってるのでWindowsでも動くと思います。でも手元にWindows環境がないのでテストしてないです。

これまで

たとえば、これまで新しくGoのワークスペース fooを作る場合次のようなコマンドを打っていました。

% mkdir -p /path/to/go_project_home/foo/src
% cd /path/to/go_project_home/foo
% export GOPATH=`pwd`

しかしこれ1回だけならまだしも、ワークスペースを変えるために毎回ディレクトリを移動して、GOPATHをexportするのが面倒だなあという思いがあったので、Pythonのvirtualenv + virtualenvwrapper を大いに参考にして genv というものを作りました。

genv ではどうなるか

上記のコマンドと同様の作業を行うにはmkgenvという1コマンドだけを打てば良くなります。

% mkgenv foo

簡単ですね!さらにワークスペースを移動したい場合はgworkonです。これで「ディレクトリの移動」と「必要な環境変数の設定」を同時に行います。

% gworkon bar

インストール方法

前提条件としてgo buildが使える環境である必要があります。手順はおおまかに

  1. ビルド
  2. genvとgenvwrapper.shを適宜配置
  3. genvwrapper.shを.bashrc/.zshrcの中でsource

まず1に関してはレポジトリを取ってきてgo buildを走らせるだけ。

% git clone https://ymotongpoo@bitbucket.org/ymotongpoo/genv.git
% cd genv
% go build -o genv main.go

2に関してはgenvはPATHが通っているところ、genvwrapper.shは適当に置いといて下さい。genvコマンドしか使わない場合はgenvwrapper.shは無視していいです。
3は、rcファイルにgenvwrapper.shを使うための環境変数GENVHOMEの設定とスクリプトの読み込みを追記するというだけ。

export GENVHOME=/path/to/go_project_root
source /path/to/genvwrapper.sh

これですべてのワークスペースは /path/to/go_project_root 以下に作成されます。

詳細

上記2つのコマンドはgenvwrapper.shで定義されている関数で、環境の作成に関しては genv コマンドを叩いているだけです。

genv

genvはPythonのvirtualenvと同様に、ディレクトリの作成と環境変数周りを変更するシェルスクリプトを一気に作成してくれるツールです。
コマンド体系はこんな感じ。

% genv [-go <GOROOT>] [-deps <dependent repos>] /path/to/workspace

genvはどこにでもgoのワークスペースを作成できます。ここで、数は少ないですがオプションの説明。

  • -go: ある特定のバージョンのGoを使いたい場合に、そのGOROOTを指定するためのもの。通常はGOROOTの変更をすることはありません。
  • -deps: ローカルにある別のワークスペース中のパッケージを使いたい場合に指定します。(GOPATHに追加されます)複数ある場合はPATHと同様にコロン区切りで。

たとえばGo 1.0.2を使い、barワークスペース内のパッケージに依存するワークスペースspamをつくる場合は、次のようにコマンドを実行します。

% genv -go /opt/go/1.0.2 -deps /path/to/bar spam
Environment /Users/ymotongpoo/src/test/spam created!

この時点では環境が作成されただけで環境変数等に変化はありません。このコマンドで実際に出来たディレクトリを覗いてみると

% tree spam
spam
├── activate
└── src/

このactivateというのが環境変数を有効化するスクリプトで、sourceで読み込むと環境が反映されます。中身は簡単なので確認してみて下さい。activateを読み込んでみます。

% source spam/activate 
(go:spam) % 

いま有効になっているワークスペース環境名がプロンプトに表示され、各種環境変数が変更されました。元に戻る時はdeactivateです。

(go:spam) % deactivate
%
genvwrapper.sh

上記genvをもっと便利に使うためのスクリプトがgenvwrapper.shです。これは環境変数 GENVHOMEで指定したディレクトリ配下にワークスペースをまとめ、さらにワークスペース環境の切り替えなどをスムーズに行います。詳細はプロジェクトのドキュメントに任せるとして、コマンド名だけ紹介します。

  • mkgenv: 新規ワークスペースの作成・移動
  • rmgenv: 既存ワークスペースの削除
  • showgenv: 既存ワークスペースの表示
  • gworkon: ワークスペース環境の切り替え・移動

感想とかバグ報告とか

開発はしばらくbitbucket上で行いますので、なにかプロジェクトのissueトラッカー、あるいはGoogle+かTwitterまでご連絡下さい。

*1:csh/tcshの方、ごめんなさい。