Go言語の依存関係管理ツール dep を使ってみる

## はじめに
一年ほど前にGo言語を勉強しはじめて、そのシンプルさを追求する言語思想にすっかりハマってしまいました。
以来botだったり簡単なスクリプトだったりはGoで書くようになったのですが、その際に便利だなーと感じだdepについて紹介させていただきます。

## depとは？
depはGoのパッケージ管理ツールです。JavaでいうMavenと考えていただければわかりやすいと思います。
これが登場する以前からGoには"Glide"というツールがあったそうなのですが、このdepはGoの公式で開発されているとのことで、現在ではこちらが主流となっているそうです。（私は最近Goに触り始めたのでGlideを使ったことはなく、depとの比較などはできません・・・）

## 使ってみる
例えばGoには標準でcron実行をさせるようなものがないので、そういった処理をさせたい場合には外部パッケージを使う必要があります。そこで今回は、一定間隔で適当な処理をさせるプログラムを、外部パッケージを使って作ってみたいと思います。

### depのインストール
depのインストールは[こちら](https://github.com/golang/dep/blob/master/README.md)に記載されている通り`go get`コマンドか、Macの場合はHomebrewでも入れられます。

```bash
$ brew install dep
```

インストールできたかどうかの確認ついでにhelpをみてみます。

```bash
$ dep
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
  version  Show the dep version information

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 -add github.com/pkg/errors  add a dependency to the project

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

無事にインストールできました。

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

プロジェクトを作成し、dep initコマンドを実行してください。

```bash
$ mkdir $GOPATH/src/dep-sample
$ cd $GOPATH/src/dep-sample
$ dep init
```

すると、以下の通り二つのファイルとvendorというディレクトリができたと思います。パッケージはこのディレクトリの中にインストールされます。

```bash
$ ls -R
Gopkg.lock     	Gopkg.toml     	vendor

./vendor:
```

次にコードを書いてしまいます。（5秒ごとに標準出力させるという単純なコードです。）このディレクトリに配置してください。

```go:main.go
package main

import (
       	"fmt"
       	"github.com/carlescere/scheduler"
       	"runtime"
)

func main() {
       	scheduler.Every(5).Seconds().Run(sayHello)
       	runtime.Goexit()
}

func sayHello() {
       	fmt.Println("Hello!")
}
```

コードの中で利用した外部パッケージは[go-scheduler](https://github.com/carlescere/scheduler)です。とても使いやすいのでおすすめです。
importしていますが、このままでは利用できないため、depを利用して下記コマンドでインストールします。

```bash
$ dep ensure
```

すると、さきほどまで空だった vendor ディレクトリに今回利用するパッケージがインストールされたことを確認いただけると思います。（なんて簡単！）

```bash
$ ls -R vendor/
github.com

vendor//github.com:
carlescere

vendor//github.com/carlescere:
scheduler

vendor//github.com/carlescere/scheduler:
LICENSE			README.md      		scheduler.go   		scheduler_test.go
```

また、アプリケーションのリストが記載される Gopkg.lock ファイルにもパッケージ情報が追記されました。

```bash
$ cat Gopkg.lock
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.


[[projects]]
  name = "github.com/carlescere/scheduler"
  packages = ["."]
  revision = "ddcf6a6be3e8bd4b480f96031d9e1f3abecf2767"
  version = "0.1"
...
```

試しに実行してみてください。外部パッケージを利用して、5秒ごとに標準出力させることができると思います。

```bash
$ go run main.go
Hello!
Hello!
Hello!
...
```

## さいごに

このように利用したいパッケージを使ったコードを書いてコマンドを実行するだけでいい感じに諸々やってくれるので、とっても楽です。ぜひ使ってみてください。

ちなみにですが、私がGo言語を勉強した本は[「スターティングGo言語」](https://www.amazon.co.jp/%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0Go%E8%A8%80%E8%AA%9E-CodeZine-BOOKS-%E6%9D%BE%E5%B0%BE-%E6%84%9B%E8%B3%80/dp/4798142417/)です。JavaやCと比較してこうだよ、みたいな記載も多いので、私にはとても理解しやすかったです。