依存関係管理ツールdep(golang)

皆さんこんにちは、Janです。最近シンプルなGo言語にハマって学び始めました。初めてのブログでGoのパッケージ管理ツールについて説明します。

# dep とは
`npm`のようなパッケージ管理・依存関係管理ツールです。

# dep と go getの違い
###  ` dep` と`go get`は類似のことをやっていますが、違う目的で使用されています。

ではそれらの違いを見てみましょう。

* go get
    - 自分のgoプロジェクトに外部パッケージを取得することで作業できるようになり、それ全てが`$GOPATH/src/github.com/`の下にダウンロードかつインストールされて共有で使用できるようになります。
* dep
    * 自分のコードに依存関係を使いたいなら、それをダウンロードして使用することができます。<br>
    ワークフローとして,コードにインポートを追加して、`dep ensure`コマンドで実行することによって`Gopkg.toml`,`Gopkg.lock`,`vendor`が更新されます。`vendor`ディレクトリ下にダウンロードされ、同じプロジェクトの皆んなで安全に確保された同じ依存関係のバージョンが使用できるようになります。


# depの使い方
## depのインストール

```
$ go get -u github.com/golang/dep/cmd/dep
```

## depコマンドの説明
```
$ dep help
dep is a tool for managing dependencies for Go projects

Usage: dep <command>

Commands:

  init    Initialize a new project with manifest and lock files
  status  Report the status of the project's dependencies
  ensure  Ensure a dependency is safely vendored in the project
  prune   Prune the vendor tree of unused packages

Examples:
  dep init                          set up a new project
  dep ensure                        install the project's dependencies
  dep ensure -update                update the locked versions of all dependencies
  dep ensure github.com/pkg/errors  add a dependency to the project

Use "dep help [command]" for more information about a command.

```

上記英語の説明文を日本語に翻訳したらもっとわかりやすいかもしれません。

```
$ dep help
depはGoプロジェクトを管理するための一つのツールです。

使い方：dep <コマンド>

コマンド:

  init    プロジェクトを初期化し、マニフェストファイル「Gopkg.toml」とロックファイル「Gopkg.lock」ファイルが生成されます。

  status  プロジェクトの依存関係のステータス(状況)を報告します。

  ensure  依存関係がプロジェクトで安全に確保されているかを確認します。
  prune   未使用のパッケージの依存関係を削除します。

例:
  dep init                          新しいプロジェクトをセットアップ
  dep ensure                        プロジェクトの依存関係をインストール
  dep ensure -update                全ての依存関係のバージョンを更新
  dep ensure github.com/pkg/errors  プロジェクトに依存関係を追加
```
## 新しいプロジェクトを作成

```
$ mkdir $GOPATH/src/github.com/trydep
```

## プロジェクトを初期化
*  新しく作成したプロジェクト`trydep`内で実行するコマンドです。

```
$ dep init
```

### `dep init`コマンドで実行することによってプロジェクト内に`Gopkg.toml`マニフェストファイルと`Gopkg.lock`ロックファイルと`vendor`ディレクトリが生成されます。

* Gopkg.toml
  * このファイルが編集することができ、アプリケーションの直接的な依存関係のリストとそれらをどこで取得するかが含まれています。

* Gopkg.lock
  * このファイルはマニフェストから生成され、アプリケーションのコードを解析します。アプリケーションの直接的と遷移的な依存関係のリストが含まれています。ロックファイルの各依存関係には、どのリビジョンを使用すべきかを明確に示すための特定の`SHA`があります。

* vendor
  * 全てのパッケージがこのディレクトリ下にインストールされます。

### golangのColor(カラー)パッケージをインストール
* 新しいmain.goファイルを作成してその中にcolorパッケージをインポートしてみましょう。

```go
package main

import "github.com/fatih/color"

func main() {
	color.Red("赤")
	color.Cyan("青緑")
	color.Blue("青")
	color.Magenta("紫")
}
```

* まだ`github.com/fatih/color`パッケージをインストールしていないので、赤い波線が表示されると思います。では、早速インストールしましょう。


## パッケージのインストール

```
$ dep ensure
```

* `dep ensure`コマンドを実行するとインポートしたいパッケージが`vendor`ディレクトリ下にインストールされ、`Gopkg.toml`ファイルと`Gopkg.lock`ファイル内にリストが追加されます。

## 現在プロジェクトの状態確認
```
$ dep status

PROJECT                        CONSTRAINT  VERSION        REVISION  LATEST   PKGS USED
github.com/aziz819/jankenGame  *           branch master  62ab977   62ab977  1
github.com/fatih/color         *           v1.5.0         570b54c   507f605  1
github.com/mattn/go-colorable  *           v0.0.9         167de6b   167de6b  1
github.com/mattn/go-isatty     *           v0.0.2         fc9e8d8   0360b2a  1
golang.org/x/crypto            *           branch master  91a49db   91a49db  1
golang.org/x/sys               *           branch master  062cd7e   f6cff07  2
```
* 最後に`dep status`コマンドを実行することで、使う目的のパッケージなどが足りていないかどうかとプロジェクトの依存関係の状態が確認できます。ご確認ください。


# 参考URL
[1]Go dependency management tool, sdboyer, (最終閲覧日：2017年9月13日)
[https://github.com/golang/dep]
[2]dep Coming to Unify Package Management in Go, Tony Wong, (最終閲覧日：2017年9月13日)
[http://engineering.pivotal.io/post/go-dep-intro/]
[3]Go開発環境構築(VSCode, gvm, delve, dep)からHello Worldするまで, B.C.Rikko, (最終閲覧日：2017年9月13日)
[http://kuroeveryday.blogspot.jp/2017/08/golang-hello-world.html]
[4]初窥dep, Tony Bai, (最終閲覧日：2017年9月13日)
[http://tonybai.com/2017/06/08/first-glimpse-of-dep/]
[5]Color package for Go (golang), fatih, (最終閲覧日：2017年9月13日)
[https://github.com/fatih/color]