エンジニアはこわくない

好きなように書く

【golang】パッケージ依存解決ツールdepが使えるようになったので使ってみた!


スポンサーリンク

f:id:tsujitaku50:20170224131252j:plain

※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.jsonmanifest.jsonvendorディレクトリが作成されるようです。

% ls
lock.json  manifest.json vendor

それぞれ中身を見てみます。

lock.json

{
    "memo": "dab02b24a752518fc799f3b27b2049c636953aabf69ad62eeb5f354c610bba7c",
    "projects": []
}

manifest.json

{}

vendorディレクトリには、何も存在していませんでした。

lock.jsonmemoに書かれている値は現時点でのパッケージ依存状態を表しているのでしょうか?

パッケージを新しくインストールしたり、バージョンアップデートすると、このファイルに書き込まれるのだろうと予想しています。

パッケージをダウンロードしてみる

試しに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.jsonmainfest.jsonvendorディレクトリを見てみます。

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なので貢献してみようかと考え中です。

おわり!!