2018年08月現在、こいつが標準的なパッケージ管理ツールらしい。
これで決定版にしてもらいたい。
2019年12月現在(Go ver 1.11以降)では go modを使うのが定番になっている。 なのでここでの知識は過去のプロジェクトを読むために使う。
brew で入れられるようなのでそれで入れる。
$ brew install dep
入ったようだ
$ dep version dep: version : v0.5.0 build date : 2018-07-26 git hash : 224a564 go version : go1.10.3 go compiler : gc platform : darwin/amd64 features : ImportDuringSolve=false
とりあえずサンプル駆動させてみる。
適当にディレクトリ掘って、初期化
$ dep init
盛大に怒られる。
init failed: unable to detect the containing GOPATH: /hoge/piyo/fuga is not within a known GOPATH/src
思い出したが、Go は他の言語と違っていて、ファイルがどこに有ってもいいわけでなく必ず GOPATH の配下に入っていないといけないのだった。 かなり忘れている。そのへんの話は Go言語 / パッケージ / パッケージ管理 / Glide でやった
GOPATH はデフォルトで ~/go
であるので確かにそこにあった。
その配下の src の下に適当にディレクトリを掘って
$ dep init
今度は成功。ファイルが2つディレクトリが1個出来上がっている。 この手のツールの定番構成である。
Gopkg.toml というのが依存パッケージの設定ファイルで、 現状と、この設定ファイルから導き出された具体的なパッケージのリストがこの Gopkg.lock で、 それによりパッケージがインストールされる場所が vender ディレクトリとなるのが大体わかる。 何も読んでないがおそらくそうだろう。
とりあえず実行させるため helloworld.go を作る
package main import "fmt" func main() { fmt.Printf("Hello world\n") }
実行すると
$ go fmt helloworld.go $ go run helloworld.go Hello world
よしよし。
今回は何か API を利用するシステムを想定して JSON のパーサーを使ってみるとする。
Go での JSON 処理はいろいろ煩雑なようだが Jason というライブラリはそのへんルーズにやってくれるようなので試してみる。
GitHub - antonholmquist/jason: Easy-to-use JSON Library for Go
このように書いて実行してみる。
package main import ( "fmt" "github.com/antonholmquist/jason" ) func main() { fmt.Printf("Hello world\n") }
当然エラーが出る。
cannot find package "github.com/antonholmquist/jason"
この依存性を dep に解決させてみよう。
Gopkg.toml を覗く。 コメントに思いっきりサンプルが載っていて直ぐにわかって嬉しい感じである。
# required = ["github.com/user/thing/cmd/thing"]
必要なやつをこういう配列風にガシガシ書けよということだろう。
なので書いてやる
required = ["github.com/antonholmquist/jason"]
これを反映させるには、
$ dep ensure
実行する。まったく無言で何も無かった vender ディレクトリ以下に jason ダウンロードされて配置された。 GOPATH/src 以下には配置されておらず、この影響が dep init 以下に閉じ込められていることがわかる。
ではもう一度実行してみよう
$ go run helloworld.go ./helloworld.go:5:2: imported and not used ....
jason import したけと使ってないよ警告が出た。 つまり OK ということである。
最後にサンプルを実行してみる
func main() { fmt.Printf("Hello world\n") exampleJSON := `{ "name": "Walter White", "age": 51, "children": [ "junior", "holly" ], "other": { "occupation": "chemist", "years": 23 } }` v, _ := jason.NewObjectFromBytes([]byte(exampleJSON)) name, _ := v.GetString("name") fmt.Printf(name) }
OK 使い方はわかった。
$ go fmt $ go run helloworld.go Hello world Walter White
おなじみの hogehoge init
$ dep init
これで
が生成される。