今回は golang で自分で作成したライブラリ(git 上に公開)を dep を使って利用するサンプルを作成します。
結果から言うと思ったより簡単でした。
dep について
dep は golang の依存関係管理ツールで glide の後継にあたります。
記事にはしていないですが、会社のツールを作成するときに glide を使ったりしてました。
dep インストール
$ go get -u github.com/golang/dep/cmd/dep
利用されるサンプルライブラリ
パッケージ内の構成
ライブラリなので、subpackage ごとに機能を分割するイメージの構成にしています。
$ tree
├── README.md
├── main.go
├── subpackage_A
│ └── sub_A.go
└── subpackage_B
└── sub_B.go
ソースコード
サンプルプログラム
ソースコードを作成
単純に 「subpackage_A」「subpackage_B」内の構造体を利用しているだけです。
main.go
package main
import (
"github.com/ynozue/lib_sample/subpackage_A"
"github.com/ynozue/lib_sample/subpackage_B"
)
func main() {
a := subpackage_A.SubA{Name: "hoge"}
a.PrintA()
b := subpackage_B.SubB{Name: "hoge"}
b.PrintA()
}
dep を使って依存関係を解決
初期の構造
$ tree
├── README.md
└── main.go
依存関係を解決
$ dep init
Using ^1.0.0 as constraint for direct dep github.com/ynozue/lib_sample
Locking in v1.0.0 (3061ef6) for direct dep github.com/ynozue/lib_sample
依存解決後の構造
「Gopkg.lock」と「Gopkg.toml」が追加され、「vendor」フォルダ内に参照ライブラリのパッケージが追加されていることが確認できます。
$ tree
├── Gopkg.lock
├── Gopkg.toml
├── README.md
├── main.go
└── vendor
└── github.com
└── ynozue
└── lib_sample
├── subpackage_A
│ └── sub_A.go
└── subpackage_B
└── sub_B.go
解決したライブラリのバージョンを確認
$ dep status
PROJECT CONSTRAINT VERSION REVISION LATEST PKGS USED
github.com/ynozue/lib_sample ^1.0.0 v1.0.0 3061ef6 v1.0.0 2
作成されたファイルの内訳
Gopkg.toml
マニフェストファイルと呼ばれ、このファイルに記載されている内容をもとにして依存関係を解決します。
$ dep init
実行時には
Gopkg.toml
[[constraint]]
name = "github.com/ynozue/lib_sample"
version = "1.0.0"
[prune]
go-tests = true
unused-packages = true
Gopkg.lock
マニフェストファイルから生成され、実際に利用しているライブラリの revision や version の管理します。
Gopkg.lock
[[projects]]
name = "github.com/ynozue/lib_sample"
packages = [
"subpackage_A",
"subpackage_B"
]
revision = "3061ef68e52b5cefa7c721b46196b8c1656cbef8"
version = "v1.0.0"
[solve-meta]
analyzer-name = "dep"
analyzer-version = 1
inputs-digest = "affabfdf90d498aef3be35364024b8ed9e8a0a454dfd1ce90cd6373ac73204c4"
solver-name = "gps-cdcl"
solver-version = 1
実行
$ go run main.go
subpackage A [hoge]
subpackage B [hoge]
まとめ
簡単にまとめましたが、dep を利用すれば簡単にプロジェクトごとに依存関係を管理したりすることができるようになるので便利です。また、自作のライブラリについても他の誰かが公開しているライブラリと同じように利用することができるので自分用であったり会社内用に作っても便利ですね。