Go言語 / パッケージ / パッケージ管理 / dep

Go言語 / パッケージ / パッケージ管理 / dep

2018年08月現在、こいつが標準的なパッケージ管理ツールらしい。

これで決定版にしてもらいたい。

2019年12月現在(Go ver 1.11以降)では go modを使うのが定番になっている。 なのでここでの知識は過去のプロジェクトを読むために使う。

Install(Mac)

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

Hello World

とりあえずサンプル駆動させてみる。

適当にディレクトリ掘って、初期化

$ 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

これで

  • Gopkg.toml ファイル
  • Gopkg.lock ファイル
  • vender ディレクトリ

が生成される。

golang/package/package_manager/dep.txt · 最終更新: 2021-08-24 19:01 by ore