【golang】パッケージ依存解決ツールdepが使えるようになったので使ってみた!
※2017年12月25日追記
depは常に進化を続けているので、この記事に書いてある情報は古い可能性があります。
最新の情報はgithubを御覧ください。
GitHub - golang/dep: Go dependency management tool
本文はここから
こんにちは、つじたく(@Tsuji_Taku50)です。
詳細はこちらに書いてあるのですが tsujitaku50.hatenablog.com
golangが公式で出したパッケージ依存解決ツール「dep」を使おうとしたら、なんと使えませんでした!
でも新しく出たものは使いたかったので、あれから色々試していました。
するとdepが使えるようになりました!(感激)
ただ、なんでこの対応で使えるようになったか分からないんですよね。。
それでも、一応僕のやったこと(そんな大層なことはしてないですが)を書いておきます。
depが使えるようになるまでに実施した対応
全然大したことはしていなくて、僕が実際に行った作業は1つで
GOPATHの中にプロジェクトを作成した
ということだけです。
今まで、GOPAHTの外にプロジェクトを作成していました。
特に理由はないのですがなんとなくGOPATHの中にプロジェクトを作るのが気持ち悪かったからです。
そして今回depが使えるようになるまで試行錯誤しているなかで、たまたまGOPAHTに中にプロジェクトを作ってdepコマンドを使ってみたら使用できるようになりました。
というわけで使っていきましょう。
depコマンド
2017/02/24現在、depコマンドには以下のコマンドが存在するようです。
今後増えるか減るかするかもしれません。
コマンド | 説明 | 備考 |
---|---|---|
init | マニフェストファイルとロックファイルを使用して新しいプロジェクトを初期化する | プロジェクトを作成して一番最初に実行するコマンド |
status | プロジェクトの依存関係のステータスを報告する | 現在の状況を確認したいときに実行するコマンド |
ensure | 依存関係がプロジェクトで安全に確保されていることを確認する | 特定のパッケージを新しいバージョンにしたいときに実行するコマンド |
remove | プロジェクトから依存関係を削除する特定の | パッケージを削除したいときに実行するコマンド |
実際に試してみました
init&ensureしてみる
まずはGOPAHTの中にプロジェクトを作成します。
README.mdに書いてあるとおりに
新規プロジェクトではdep init
コマンドとdep ensure -update
コマンドを実行します。
% dep init % dep ensure -update
すると、lock.json
とmanifest.json
とvendor
ディレクトリが作成されるようです。
% ls lock.json manifest.json vendor
それぞれ中身を見てみます。
lock.json
{ "memo": "dab02b24a752518fc799f3b27b2049c636953aabf69ad62eeb5f354c610bba7c", "projects": [] }
manifest.json
{}
vendorディレクトリには、何も存在していませんでした。
lock.json
のmemo
に書かれている値は現時点でのパッケージ依存状態を表しているのでしょうか?
パッケージを新しくインストールしたり、バージョンアップデートすると、このファイルに書き込まれるのだろうと予想しています。
パッケージをダウンロードしてみる
試しにmain.goにこんなコードを書いてみました。
package main import ( "github.com/google/go-github/github" "fmt" ) func main() { client := github.NewClient(nil) orgs, _, err := client.Organizations.List(ctx, "willnorris", nil) if err != nil { } fmt.Println(orgs) }
この状態でdep ensure
コマンドを実行するとパッケージにダウンロードを行ってくれるはずです。
ダウンロード対象はgithub.com/google/go-github/github
パッケージです。
パッケージのダウンロードにはdep ensure -update
というupdate
オプションを使用します。
% dep ensure -update
lock.json
とmainfest.json
とvendor
ディレクトリを見てみます。
lock.json
{ "memo": "7a3c491ab80f946047966cdddf8ce057c58375f329cd5da8381626fab0edf455", "projects": [ { "name": "github.com/google/go-github", "branch": "master", "revision": "b59d3a6479bd00374a1523ad032da4621d9dd84a", "packages": [ "github" ] }, { "name": "github.com/google/go-querystring", "branch": "master", "revision": "53e6ce116135b80d037921a7fdd5138cf32d7a8a", "packages": [ "query" ] } ] }
mainfest.json
{}
vendor
ディレクトリ
% ls vendor/github.com/google/go-github/ go-github/ go-querystring/
依存関係情報が、lock.json
に書き込まれてるようです。
vendor
ディレクトリ以下にもパッケージがダウンロードされていますね!
ただ、manifest.json
には何も書き込まれていないのですがこれはいったい。。。
※manifest.jsonに何も書き込まれないバグのissueがありました!
manifest.json is empty after dep init · Issue #149 · golang/dep · GitHub
なるほど。。まだ不安定なようですね。
関連ファイルを削除してもう一度dep init
コマンドからやり直すとmanifest.json
にも情報が書き込まれていました。
{ "dependencies": { "github.com/google/go-github": { "branch": "master" } } }
ダウンロードしたパッケージの削除
最後にダウンロードしたパッケージを削除してみましょう。
% dep remove github.com/google/go-github not removing "github.com/google/go-github" because it is imported by "workspace/go-github-example" (pass -force to override)
おお!使用中のパッケージを削除しようとするとエラーになるようです。
というわけでgo-github
パッケージの使用を止めました。
改めて、削除してみます。
[~/.go/src/workspace/go-github-example] (git)-[master]- % dep remove github.com/google/go-github
lock.json
{ "memo": "dab02b24a752518fc799f3b27b2049c636953aabf69ad62eeb5f354c610bba7c", "projects": [] }
manifest.json
{}
vendor
ディレクトリ以下のパッケージも全て削除されていました。
わりと簡単に削除できました!
まとめ
他にも細かいオプションなどがあるんですが、
これまでの操作で一通りdep
を使えるようになるんじゃないかなと思います。
ただ公式にも
Depは公式のツールではありません。 Goチームによって(まだ)祝福されていない
と書いてあるようにまだまだ不安定なようです。
遊びや個人プロジェクトで使うときには良いと思いますが、チームで使うときは少しためらいますね。
とりあえず個人で使ってみようかと思います!
OSSなので貢献してみようかと考え中です。
おわり!!