久しぶりに glide を使おうと最新版(0.13.0)を見に行ったら “Consider switching to dep” とか書いてあるじゃないですか。

Glide is used by a great number of projects and will continue to get support for some time. But, the near future is likely in dep.

まじすか。

つまり「依存関係(Vendoring)管理ツールとしては dep を推奨するけど移行できない人のために当面はサポートを続けるよ(でも将来は分からん)」という解釈でいいのだろうか。じゃあ dep に移行するしかないぢゃん。

とはいえ,いきなり本番環境に投入するのは怖いので,なにか適当なテストケースはないか,と自分のリポジトリを漁ってたら丁度いいのがありました。

これはモンテカルロ法で遊んでたときに作ったものなので,最悪ぶっ壊れてもいいのである。では移行を始めよう。

dep の取得

dep のリポジトリは go get コマンドで取得できる。

$ go get -v github.com/golang/dep
github.com/golang/dep (download)
github.com/golang/dep/vendor/github.com/pkg/errors
github.com/golang/dep/vendor/github.com/Masterminds/semver
github.com/golang/dep/vendor/github.com/armon/go-radix
github.com/golang/dep/vendor/github.com/Masterminds/vcs
github.com/golang/dep/vendor/github.com/boltdb/bolt
github.com/golang/dep/internal/fs
github.com/golang/dep/vendor/github.com/golang/protobuf/proto
github.com/golang/dep/internal/gps/paths
github.com/golang/dep/internal/gps/pkgtree
github.com/golang/dep/vendor/github.com/nightlyone/lockfile
github.com/golang/dep/vendor/github.com/sdboyer/constext
github.com/golang/dep/vendor/github.com/jmank88/nuts
github.com/golang/dep/vendor/golang.org/x/net/context
github.com/golang/dep/vendor/github.com/pelletier/go-buffruneio
github.com/golang/dep/vendor/golang.org/x/sync/errgroup
github.com/golang/dep/vendor/github.com/pelletier/go-toml
github.com/golang/dep/internal/gps/internal/pb
github.com/golang/dep/internal/gps
github.com/golang/dep

これをこのままインストールしてもいいのだが

$ go install -v github.com/golang/dep/cmd/dep
github.com/golang/dep/vendor/github.com/go-yaml/yaml
github.com/golang/dep/internal/feedback
github.com/golang/dep/internal/importers/base
github.com/golang/dep/internal/importers/godep
github.com/golang/dep/internal/importers/vndr
github.com/golang/dep/internal/importers/gvt
github.com/golang/dep/internal/importers/glide
github.com/golang/dep/internal/importers/govend
github.com/golang/dep/internal/importers
github.com/golang/dep/cmd/dep

リリースページにビルド済みのモジュールが置かれているので,ありがたくこれを使わせてもらう。最新版(現時点で v0.3.1)には Windows 用のモジュール dep-windows-amd64 もある。Windows ユーザはなんのファイルかと思うかもしれないが,実はこれ実行ファイルなので, dep.exe にリネームしてそのまま使える。

一応,動作確認をしておこう。

$ dep
dep is a tool for managing dependencies for Go projects

Usage: dep <command>

Commands:

  init     Initialize a new project with manifest and lock files
  status   Report the status of the project's dependencies
  ensure   Ensure a dependency is safely vendored in the project
  prune    Prune the vendor tree of unused packages
  version  Show the dep version information

Examples:
  dep init                               set up a new project
  dep ensure                             install the project's dependencies
  dep ensure -update                     update the locked versions of all dependencies
  dep ensure -add github.com/pkg/errors  add a dependency to the project

Use "dep help [command]" for more information about a command.

$ dep version
dep:
 version     : v0.3.1
 build date  : 2017-09-19
 git hash    : 83789e2
 go version  : go1.9
 go compiler : gc
 platform    : windows/amd64

glide から dep への移行

spiegel-im-spiegel/pi をビルド可能な適当な場所に置く。

この時の glide.yaml はこんな感じになっている。

package: github.com/spiegel-im-spiegel/pi
import:
- package: github.com/spiegel-im-spiegel/gocli
- package: github.com/spf13/cobra
- package: github.com/pkg/errors
- package: github.com/seehuhn/mt19937
- package: github.com/davidminor/gorand
- package: github.com/davidminor/uint128

また glide.lock はこんな感じ。

hash: d570123d6231810c51dd17e415673df221fb2dec7ef6ab45cd34093002a87cbb
updated: 2016-11-16T17:28:38.2997832+09:00
imports:
- name: github.com/davidminor/gorand
  version: 189780b8053a44a111339a4248394fd844c1da40
  subpackages:
  - lcg
- name: github.com/davidminor/uint128
  version: 5745f1bf80414e0ad2670e85d6aece8c58031def
- name: github.com/inconshreveable/mousetrap
  version: 76626ae9c91c4f2a10f34cad8ce83ea42c93bb75
- name: github.com/pkg/errors
  version: 248dadf4e9068a0b3e79f02ed0a610d935de5302
- name: github.com/seehuhn/mt19937
  version: 98c0ea580d2f3c5a171acf4d4f15321b72209d08
- name: github.com/spf13/cobra
  version: 6b74a60562f5c1c920299b8f02d153e16f4897fc
- name: github.com/spf13/pflag
  version: 5ccb023bc27df288a957c5e994cd44fd19619465
- name: github.com/spiegel-im-spiegel/gocli
  version: 5929f04fb8e4a19ac29fdf658866f9441f339cd9
testImports: []

この状態で dep init を実行する。

$ dep init
Importing configuration from glide. These are only initial constraints, and are further refined during the solve process.
Detected glide configuration files...
Converting from glide.yaml and glide.lock...
  Using * as initial constraint for imported dep github.com/spiegel-im-spiegel/gocli
  Trying v0.3.0 (5929f04) as initial lock for imported dep github.com/spiegel-im-spiegel/gocli
  Using * as initial constraint for imported dep github.com/spf13/cobra
  Trying * (6b74a60) as initial lock for imported dep github.com/spf13/cobra
  Using * as initial constraint for imported dep github.com/pkg/errors
  Trying * (248dadf) as initial lock for imported dep github.com/pkg/errors
  Using * as initial constraint for imported dep github.com/seehuhn/mt19937
  Trying master (98c0ea5) as initial lock for imported dep github.com/seehuhn/mt19937
  Using * as initial constraint for imported dep github.com/davidminor/gorand
  Trying * (189780b) as initial lock for imported dep github.com/davidminor/gorand
  Using * as initial constraint for imported dep github.com/davidminor/uint128
  Trying master (5745f1b) as initial lock for imported dep github.com/davidminor/uint128
  Using * as initial constraint for imported dep github.com/inconshreveable/mousetrap
  Trying v1.0 (76626ae) as initial lock for imported dep github.com/inconshreveable/mousetrap
  Using * as initial constraint for imported dep github.com/spf13/pflag
  Trying * (5ccb023) as initial lock for imported dep github.com/spf13/pflag

これにより Gopkg.toml および Gopkg.lock の2つのファイルと vendor/ フォルダが作成される。このうち spiegel-im-spiegel/gocli の最新版は v0.4.0 だが, glide.lock の内容を読み取って,ちゃんと v0.3.0 のものを取ってきているようだ。

Gopkg.toml の内容は以下の通り。

[[constraint]]
  name = "github.com/davidminor/gorand"

[[constraint]]
  name = "github.com/pkg/errors"

[[constraint]]
  name = "github.com/seehuhn/mt19937"

[[constraint]]
  name = "github.com/spf13/cobra"

[[constraint]]
  name = "github.com/spiegel-im-spiegel/gocli"

Gopkg.lock の内容は以下の通りだ。

[[projects]]
  name = "github.com/davidminor/gorand"
  packages = ["lcg"]
  revision = "189780b8053a44a111339a4248394fd844c1da40"

[[projects]]
  branch = "master"
  name = "github.com/davidminor/uint128"
  packages = ["."]
  revision = "5745f1bf80414e0ad2670e85d6aece8c58031def"

[[projects]]
  name = "github.com/inconshreveable/mousetrap"
  packages = ["."]
  revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75"
  version = "v1.0"

[[projects]]
  name = "github.com/pkg/errors"
  packages = ["."]
  revision = "248dadf4e9068a0b3e79f02ed0a610d935de5302"

[[projects]]
  branch = "master"
  name = "github.com/seehuhn/mt19937"
  packages = ["."]
  revision = "98c0ea580d2f3c5a171acf4d4f15321b72209d08"

[[projects]]
  name = "github.com/spf13/cobra"
  packages = ["."]
  revision = "6b74a60562f5c1c920299b8f02d153e16f4897fc"

[[projects]]
  name = "github.com/spf13/pflag"
  packages = ["."]
  revision = "5ccb023bc27df288a957c5e994cd44fd19619465"

[[projects]]
  name = "github.com/spiegel-im-spiegel/gocli"
  packages = ["."]
  revision = "5929f04fb8e4a19ac29fdf658866f9441f339cd9"
  version = "v0.3.0"

[solve-meta]
  analyzer-name = "dep"
  analyzer-version = 1
  inputs-digest = "4a7cc1799d386351173ccdf8266d22ebe2971ce7ba417395a0b63ca267ea9267"
  solver-name = "gps-cdcl"
  solver-version = 1

glide.lockGopkg.lock の内容がきちんとマッチしているのが分かると思う。念のため status も見ておこう。

$ dep status
PROJECT                               CONSTRAINT  VERSION        REVISION  LATEST   PKGS USED
github.com/davidminor/gorand          *                          189780b            1
github.com/davidminor/uint128         *           branch master  5745f1b   5745f1b  1
github.com/inconshreveable/mousetrap  *           v1.0           76626ae   76626ae  1
github.com/pkg/errors                 *                          248dadf            1
github.com/seehuhn/mt19937            *           branch master  98c0ea5   98c0ea5  1
github.com/spf13/cobra                *                          6b74a60            1
github.com/spf13/pflag                *                          5ccb023            1
github.com/spiegel-im-spiegel/gocli   *           v0.3.0         5929f04   ce636bb  1

ビルドもちゃんと通る。

$ go build -v ./...
github.com/spiegel-im-spiegel/pi/vendor/github.com/spiegel-im-spiegel/gocli
github.com/spiegel-im-spiegel/pi/vendor/github.com/spf13/pflag
github.com/spiegel-im-spiegel/pi/vendor/github.com/inconshreveable/mousetrap
github.com/spiegel-im-spiegel/pi/vendor/github.com/davidminor/uint128
github.com/spiegel-im-spiegel/pi/vendor/github.com/seehuhn/mt19937
github.com/spiegel-im-spiegel/pi/vendor/github.com/pkg/errors
github.com/spiegel-im-spiegel/pi/vendor/github.com/davidminor/gorand/lcg
github.com/spiegel-im-spiegel/pi/gencmplx
github.com/spiegel-im-spiegel/pi/qq
github.com/spiegel-im-spiegel/pi/genpi
github.com/spiegel-im-spiegel/pi/plot
github.com/spiegel-im-spiegel/pi/estmt
github.com/spiegel-im-spiegel/pi/vendor/github.com/spf13/cobra
github.com/spiegel-im-spiegel/pi/cmd
github.com/spiegel-im-spiegel/pi

というわけで, glide.yamlglide.lock が正しい状態で残っていれば問題なく dep に移行できそうだ。

ブックマーク