govirtualenv: Go言語用のpython virtualenv

# govirtualenv - Go言語用のvirtualenv

## 概要

- Go言語向けに、pythonのvirtualenvっぽいツールを作りました
- Windows/Linux/MacOSで利用できます
- 宣伝風記事です
- goenvとかgvmとかあるじゃんと言うのは知ってます

### 2017/11/30 追記
- version 0.1としてリリースしました。Windows/Linux/MacOSに対応しています

### 2017/11/29 追記
- RC5にて Windowsに対応しました。特に何もなければversion 0.1としてリリース予定です


# 本題

Pythonでプロジェクト（あるいは開発環境ごと）にパッケージを管理したい、というときには`virtualenv` によってPython仮想環境を作成するのが一般的です。

```bash
# 環境の構築
$ virtualenv MyProjectEnv
$ source MyProjectEnv/bin/activate

# ここからPython仮想環境
(MyProjectEnv) $

# 仮想環境のみにパッケージをインストール
(MyProjectEnv) $ pip install sphinx
(MyProjectEnv) $ deactivate
```

一方Go言語では、`GOPATH`を使うと、プロジェクト毎にパッケージがインストールされるようになってますので、（バージョンはともかくとして）プロジェクト毎のパッケージ管理は容易です。

```bash
$ export GOROOT=<MyGOROOT>
$ export GOPATH=<MyProjectPath>

# パッケージのインストール
$ go get github.com/....
```

しかし、上記のように環境変数に`GOPATH`、`GOROOT`を設定しなければなりません。これではタ端末を閉じるたびに再設定する必要があります。`.bashrc` に記載しておけば良いのですが、それでは、**プロジェクト毎に切り替える** のが容易ではなくなるでしょう。

そこでGO言語には`goenv` 、`gvm` という有名なツールが既に存在しています。
これらのツールはGo言語の各バージョンのインストールの簡易化、`GOROOT`の切り替えを容易にしました。

しかし、**どのプロジェクトが、どのバージョンのGoを使っているか**と**GOPATHの切り替え**はユーザが判断し、実行する必要がありました。

そこで、今のところ見当たらなかったので、これらを容易にするツールを作成することにしました。それが次から紹介する`govirtualenv`です。

## govirtualenv
`govirtualenv`はGo言語用の環境作成、切り替えツールです。
インストールスクリプト以外はすべてGo言語で書かれています。

主な機能は以下に挙げる物があります。

- Go言語バージョンの管理（インストール、アンインストール）
- プロジェクト作成
- プロジェクト毎の`GOROOT`と`GOPATH`の切り替え

### Github

[govirtualenv: Creates a golang virtual environment. 
](https://github.com/necomeshi/govirtualenv)


### 使い方

```shell-session
$ govirtualenv --help
Usage: govirtualenv <flags> <subcommand> <subcommand args>

Subcommands:
	available        Show available golang version
	change           change changes current using golang version.
	commands         list all command names
	flags            describe all known top-level flags
	help             describe subcommands and their syntax
	install          Install new golang version
	list             Show all installed golang version
	remove           Remove installed golang version
	startproject     Start new project with given golang verison


Use "govirtualenv flags" for a list of top-level flags
```

#### Go言語バージョンの管理

新しいGo言語のバージョンをインストールするには、パッケージを入れるか、ビルドするか、ともかく、手間がかかります。
`govirtualenv` では次のようにして簡単にインストールすることができます

```shell-session
$ govirtualenv available # インストールできるバージョンを調べる
go1
go1.0.1
go1.0.2
go1.0.3
go1.1
 --- Goのバージョンが続く ---
weekly.2012-03-13
weekly.2012-03-22
weekly.2012-03-27

$ govirtualenv install go1.9.1 # 1.9.1をインストール
```

また、削除したい場合には

```shell-session
$ govirtualenv list # インストール済みのバージョンを表示
go1.9.1
....

$ govirtualenv go1.9.1 # 削除
```

このように、`govirtualenv`がすべてを管理します。

#### プロジェクトの作成

`govirtualenv` では、他のツールと異なり、`プロジェクト`の作成ができます。

```shell-session
$ govirtualenv startproject go1.9.1 MyProject #go1.9.1 を使うプロジェクトを作成
Project MyProject created.

$ ls -a MyProject
./        ../       .project/
```

`.project` ディレクトリには、`govirtualenv` のためのデータや、ユーザのためのツールが入っています。

#### プロジェクト毎の`GOROOT`と`GOPATH`の切り替え

`govirtualenv` を使えば、いちいち 他のプロジェクトの作業を始める時に、`export` や `set` を使う必要がなくなります。また、「このプロジェクトで使ってたバージョンってなんだっけ」と言うこともなくなります。

プロジェクトを作成したら、次のようにするだけで、`GOROOT` も `GOPATH` も設定されます.

```shell-session
$ ls 
MyProject/

$ source MyProject/.project/bin/activate

(MyProject) $

(MyProject) $ echo $GOROOT
/home/your-name/.govenv/goroots/go1.9.1

(MyProject) $ echo $GOPATH
/home/your-name/MyProject
```

Pythonの `virtualenv` のように、仮想環境に入ることができます。
プロジェクトの作業が終わって、次の作業に移りたい場合は

```shell-session
(MyProject) $ deactivate

$
```

とするだけで、元の環境に戻ります。

## 終わりに

いかがでしたでしょうか。
もし興味があるなら、ぜひ使ってみてください。


## 本音

ぶっちゃけ、自分のためのツールなので、広まっていくことは期待してません。
そして、私はGo言語歴１年程度なので、簡単に言うと習作みたいなものです。