List of Glide - text.Baldanders.info
tag:text.Baldanders.info,2017-10-10:/tags
2017-10-10T18:02:56+09:00
帰ってきた「しっぽのさきっちょ」
https://text.baldanders.info/images/avatar.jpg
https://text.baldanders.info/images/avatar.jpg
Glide から Dep への移行を検討する
tag:text.Baldanders.info,2017-10-10:/golang/consider-switching-from-glide-to-dep/
2017-10-10T09:02:56+00:00
2020-01-03T06:05:57+00:00
つまり「依存関係(Vendoring)管理ツールとしては dep を推奨するけど移行できない人のために当面はサポートを続けるよ(でも将来は分からん)」という解釈でいいのだろうか。
Spiegel
https://baldanders.info/profile/
<p>(この記事は <a href="https://qiita.com/spiegel-im-spiegel/items/e931ad1a7565d02d179e">Qiita とのマルチポスト</a>です。
まぁ,向こうは草稿版だけど)</p>
<p>久しぶりに <a href="https://github.com/Masterminds/glide" title="Masterminds/glide">glide</a> を使おうと最新版(<a href="https://github.com/Masterminds/glide/releases/tag/v0.13.0" title="Release 0.13.0 · Masterminds/glide">0.13.0</a>)を見に行ったら “<strong>Consider switching to <a href="https://golang.github.io/dep/" title="dep · Dependency management for Go">dep</a></strong>” とか書いてあるじゃない。</p>
<figure lang="en">
<blockquote>
<q>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.
dep can handle importing Glide config files.
Please consider trying dep on your project or converting to dep.</q>
</blockquote>
<figcaption><div>via <q><a href="https://github.com/Masterminds/glide/releases/tag/v0.13.0">Release 0.13.0</a></q></div></figcaption>
</figure>
<p>まじすか。</p>
<p>つまり「依存関係(Vendoring)管理ツールとしては <a href="https://golang.github.io/dep/" title="dep · Dependency management for Go">dep</a> を推奨するけど移行できない人のために当面はサポートを続けるよ(でも将来は分からん)」という解釈でいいのだろうか。</p>
<p><a href="https://golang.github.io/dep/" title="dep · Dependency management for Go">dep</a> は <a href="https://golang.org/" title="The Go Programming Language">Go 言語</a>開発プロジェクトの公式ツールで,2017年の始めくらいに日本でも話題になったような気がするが,私は <a href="https://github.com/Masterminds/glide" title="Masterminds/glide">glide</a> で完全に満足していたのでスルーしていた。
こんなことになるなんて。
ならもう <a href="https://golang.github.io/dep/" title="dep · Dependency management for Go">dep</a> に移行するしかないぢゃん。</p>
<p>とはいえ,いきなり本番環境に投入するのは怖いので,なにか適当なテストケースはないか,と自分のリポジトリを漁ってたら丁度いいのがあったよ。</p>
<ul>
<li><a href="https://github.com/spiegel-im-spiegel/pi">spiegel-im-spiegel/pi: Estimate of Pi with Monte Carlo method.</a></li>
</ul>
<p>これって<a href="https://text.baldanders.info/golang/estimate-of-pi/">モンテカルロ法で遊んでた</a>ときに作ったものだ。
最悪ぶっ壊れてもいいので,これ使って試してみるか。</p>
<h2><a href="https://golang.github.io/dep/" title="dep · Dependency management for Go">dep</a> の取得</h2>
<p>まず <a href="https://golang.github.io/dep/" title="dep · Dependency management for Go">dep</a> の取得から始めないとだが,リポジトリ自体は <code>go get</code> コマンドで取得できる。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ go get -u github.com/golang/dep/cmd/dep
</span></span></code></pre></div><p>これをこのまま使ってもいいのだが,<a href="https://github.com/golang/dep/releases" title="Releases · golang/dep">リリースページ</a>にビルド済みのモジュールが置かれているので,ありがたくこれを使わせてもらおう。</p>
<p>最新版(現時点で <a href="https://github.com/golang/dep/releases/tag/v0.4.1" title="Release v0.4.1 · golang/dep">v0.4.1</a>)には Windows 用のモジュール <code>dep-windows-amd64.exe</code> もある。
これを <code>dep.exe</code> にリネームして使う。</p>
<p>万が一があっては困るのでモジュールの SHA256 ハッシュ値を確認しておく(こういうのこそ OpenPGP を使ってくれないものか)。
Windows ユーザで Windows 8.1 以降であれば PowerShell(4.0 以上)で <a href="http://technet.microsoft.com/en-us/library/dn520872.aspx"><code>Get-FileHash</code></a> コマンドレットが使える<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nb">PS </span><span class="n">C:</span><span class="p">\</span><span class="n">Users</span><span class="p">\</span><span class="n">username</span><span class="p">\</span><span class="n">Downloads</span><span class="p">></span> <span class="nb">Get-FileHash</span> <span class="nb">dep-windows</span><span class="n">-amd64</span><span class="p">.</span><span class="py">exe</span> <span class="n">-Algorithm</span> <span class="n">SHA256</span> <span class="p">|</span> <span class="nb">Format-List</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Algorithm</span> <span class="err">:</span> <span class="n">SHA256</span>
</span></span><span class="line"><span class="cl"><span class="n">Hash</span> <span class="err">:</span> <span class="n">F6E6A872C54D5AE7536AC71FD5BCAC9F4E7B8A1DAFA1EF7C23866E2F3069FE4E</span>
</span></span><span class="line"><span class="cl"><span class="n">Path</span> <span class="err">:</span> <span class="n">C:</span><span class="p">\</span><span class="n">Users</span><span class="p">\</span><span class="n">username</span><span class="p">\</span><span class="n">Downloads</span><span class="p">\</span><span class="nb">dep-windows</span><span class="n">-amd64</span><span class="p">.</span><span class="py">exe</span>
</span></span></code></pre></div><p>これを <code>dep-windows-amd64.exe.sha256</code> に記載されている値と比較する。
改竄されてなければ同じ値になるはずである。
目視は辛いのでテキストエディタ等の検索機能を使えばいいだろう。</p>
<div class="box"><strong>【2017-10-31 追記】</strong> だんだん面倒になってきたので<a href="https://github.com/spiegel-im-spiegel/hash" title="spiegel-im-spiegel/hash: Calculating Hash Value">ハッシュ値を計算するツール</a>を作った。
詳しくは「<a href="https://text.baldanders.info/golang/calculating-hash-value/">Hash 値を計算するパッケージを作ってみた</a>」を参照のこと。</div>
<!--
Windows ユーザには(`sha256sum` といった)標準ツールがないのが痛いのだが, [7-Zip] があるなら,これを使ってハッシュ値を確認できる。
```text
$ 7z.exe h -scrcSHA256 dep-windows-amd64
7-Zip [64] 16.04 : Copyright (c) 1999-2016 Igor Pavlov : 2016-10-04
Scanning
1 file, 7696896 bytes (7517 KiB)
SHA256 Size Name
---------------------------------------------------------------- ------------- ------------
D4BF3EC10B1808CAB883C6AB2901C396CF463E684FDA350199E93E31806C194A 7696896 dep-windows-amd64
---------------------------------------------------------------- ------------- ------------
D4BF3EC10B1808CAB883C6AB2901C396CF463E684FDA350199E93E31806C194A 7696896
Size: 7696896
SHA256 for data: D4BF3EC10B1808CAB883C6AB2901C396CF463E684FDA350199E93E31806C194A
Everything is Ok
```
これを `dep-windows-amd64.sha256` に記載されている値と比較する。
改竄されてなければ同じ値になるはずである。
目視は辛いのでテキストエディタ等の検索機能を使えばいいだろう。
<div class="box"><p><a href="http://www.nyaos.org/index.cgi?p=NYAGOS" title="NYAOS.ORG - NYAGOS">NYAGOS</a> を使っている人なら <code>.nyagos</code> ファイルに</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-lua" data-lang="lua"><span class="line"><span class="cl"><span class="n">alias</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="n">sha1sum</span><span class="o">=</span><span class="s1">'%COMSPEC% /c </span><span class="se">\"</span><span class="s1">%PROGRAMFILES%/7-Zip/7z.exe</span><span class="se">\"</span><span class="s1"> h -scrcSHA1 $*'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">sha256sum</span><span class="o">=</span><span class="s1">'%COMSPEC% /c </span><span class="se">\"</span><span class="s1">%PROGRAMFILES%/7-Zip/7z.exe</span><span class="se">\"</span><span class="s1"> h -scrcSHA256 $*'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>とか記述しておけば</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ sha256sum dep-windows-amd64
</span></span></code></pre></div><p>で同じ結果が得られる。
改竄の有無を確認するためにファイルのハッシュ値を調べることはよくあるので準備しておくとよい。</p>
</div>
-->
<p>実行モジュールの動作確認もしておく。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ dep
</span></span><span class="line"><span class="cl">Dep is a tool for managing dependencies for Go projects
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Usage: "dep [command]"
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Commands:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> init Set up a new Go project, or migrate an existing one
</span></span><span class="line"><span class="cl"> status Report the status of the project's dependencies
</span></span><span class="line"><span class="cl"> ensure Ensure a dependency is safely vendored in the project
</span></span><span class="line"><span class="cl"> prune Pruning is now performed automatically by dep ensure.
</span></span><span class="line"><span class="cl"> version Show the dep version information
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Examples:
</span></span><span class="line"><span class="cl"> dep init set up a new project
</span></span><span class="line"><span class="cl"> dep ensure install the project's dependencies
</span></span><span class="line"><span class="cl"> dep ensure -update update the locked versions of all dependencies
</span></span><span class="line"><span class="cl"> dep ensure -add github.com/pkg/errors add a dependency to the project
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Use "dep help [command]" for more information about a command.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ dep version
</span></span><span class="line"><span class="cl">dep:
</span></span><span class="line"><span class="cl"> version : v0.4.1
</span></span><span class="line"><span class="cl"> build date : 2018-01-24
</span></span><span class="line"><span class="cl"> git hash : 37d9ea0a
</span></span><span class="line"><span class="cl"> go version : go1.9.1
</span></span><span class="line"><span class="cl"> go compiler : gc
</span></span><span class="line"><span class="cl"> platform : windows/amd64
</span></span></code></pre></div><h2><a href="https://github.com/Masterminds/glide" title="Masterminds/glide">glide</a> から <a href="https://golang.github.io/dep/" title="dep · Dependency management for Go">dep</a> への移行</h2>
<p>お試し用の <a href="https://github.com/spiegel-im-spiegel/pi" title="spiegel-im-spiegel/pi: Estimate of Pi with Monte Carlo method.">spiegel-im-spiegel/pi</a> をビルド可能な適当な場所に置く。</p>
<p>このパッケージの <code>glide.yaml</code> はこんな感じになっている。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">package</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/spiegel-im-spiegel/pi</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">import</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">package</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/spiegel-im-spiegel/gocli</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">package</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/spf13/cobra</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">package</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/pkg/errors</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">package</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/seehuhn/mt19937</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">package</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/davidminor/gorand</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">package</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/davidminor/uint128</span><span class="w">
</span></span></span></code></pre></div><p>また <code>glide.lock</code> はこんな感じ。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">hash</span><span class="p">:</span><span class="w"> </span><span class="l">d570123d6231810c51dd17e415673df221fb2dec7ef6ab45cd34093002a87cbb</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">updated</span><span class="p">:</span><span class="w"> </span><span class="ld">2016-11-16T17:28:38.2997832</span><span class="m">+09</span><span class="p">:</span><span class="m">00</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">imports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/davidminor/gorand</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">189780b8053a44a111339a4248394fd844c1da40</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">subpackages</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lcg</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/davidminor/uint128</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">5745f1bf80414e0ad2670e85d6aece8c58031def</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/inconshreveable/mousetrap</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">76626ae9c91c4f2a10f34cad8ce83ea42c93bb75</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/pkg/errors</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">248dadf4e9068a0b3e79f02ed0a610d935de5302</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/seehuhn/mt19937</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">98c0ea580d2f3c5a171acf4d4f15321b72209d08</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/spf13/cobra</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">6b74a60562f5c1c920299b8f02d153e16f4897fc</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/spf13/pflag</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">5ccb023bc27df288a957c5e994cd44fd19619465</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/spiegel-im-spiegel/gocli</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">5929f04fb8e4a19ac29fdf658866f9441f339cd9</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">testImports</span><span class="p">:</span><span class="w"> </span><span class="p">[]</span><span class="w">
</span></span></span></code></pre></div><p>この状態で <code>dep init</code> コマンドを実行する。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ dep init
</span></span><span class="line"><span class="cl">Importing configuration from glide. These are only initial constraints, and are further refined during the solve process.
</span></span><span class="line"><span class="cl">Detected glide configuration files...
</span></span><span class="line"><span class="cl">Converting from glide.yaml and glide.lock...
</span></span><span class="line"><span class="cl"> Trying v0.3.0 (5929f04) as initial lock for imported dep github.com/spiegel-im-spiegel/gocli
</span></span><span class="line"><span class="cl"> Trying * (6b74a60) as initial lock for imported dep github.com/spf13/cobra
</span></span><span class="line"><span class="cl"> Trying * (248dadf) as initial lock for imported dep github.com/pkg/errors
</span></span><span class="line"><span class="cl"> Trying master (98c0ea5) as initial lock for imported dep github.com/seehuhn/mt19937
</span></span><span class="line"><span class="cl"> Trying * (189780b) as initial lock for imported dep github.com/davidminor/gorand
</span></span><span class="line"><span class="cl"> Trying master (5745f1b) as initial lock for imported dep github.com/davidminor/uint128
</span></span><span class="line"><span class="cl"> Trying v1.0 (76626ae) as initial lock for imported dep github.com/inconshreveable/mousetrap
</span></span><span class="line"><span class="cl"> Trying * (5ccb023) as initial lock for imported dep github.com/spf13/pflag
</span></span><span class="line"><span class="cl"> Locking in (248dadf) for direct dep github.com/pkg/errors
</span></span><span class="line"><span class="cl"> Locking in (6b74a60) for direct dep github.com/spf13/cobra
</span></span><span class="line"><span class="cl"> Using master as constraint for direct dep github.com/seehuhn/mt19937
</span></span><span class="line"><span class="cl"> Locking in master (98c0ea5) for direct dep github.com/seehuhn/mt19937
</span></span><span class="line"><span class="cl"> Using ^0.3.0 as constraint for direct dep github.com/spiegel-im-spiegel/gocli
</span></span><span class="line"><span class="cl"> Locking in v0.3.0 (5929f04) for direct dep github.com/spiegel-im-spiegel/gocli
</span></span><span class="line"><span class="cl"> Locking in (189780b) for direct dep github.com/davidminor/gorand
</span></span></code></pre></div><p>実は <a href="https://github.com/spiegel-im-spiegel/gocli" title="spiegel-im-spiegel/gocli: Command line interface">spiegel-im-spiegel/gocli</a> パッケージの最新版は v0.5.0 だが, <code>glide.lock</code> の内容を読み取って,ちゃんと v0.3.0 のものを取ってきているようだ。
偉いぞ!</p>
<p><code>dep init</code> コマンドにより <a href="https://golang.github.io/dep/docs/Gopkg.toml.html" title="Gopkg.toml · dep"><code>Gopkg.toml</code></a> および <a href="https://golang.github.io/dep/docs/Gopkg.lock.html" title="Gopkg.lock · dep"><code>Gopkg.lock</code></a> の2つのファイルと <code>vendor/</code> フォルダが作成される。
このうち <a href="https://golang.github.io/dep/docs/Gopkg.toml.html" title="Gopkg.toml · dep"><code>Gopkg.toml</code></a> の内容は以下の通り。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">constraint</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">branch</span> <span class="p">=</span> <span class="s2">"master"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">name</span> <span class="p">=</span> <span class="s2">"github.com/seehuhn/mt19937"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">constraint</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">name</span> <span class="p">=</span> <span class="s2">"github.com/spiegel-im-spiegel/gocli"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">version</span> <span class="p">=</span> <span class="s2">"0.3.0"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">prune</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">go-tests</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"> <span class="nx">unused-packages</span> <span class="p">=</span> <span class="kc">true</span>
</span></span></code></pre></div><p>そして <a href="https://golang.github.io/dep/docs/Gopkg.lock.html" title="Gopkg.lock · dep"><code>Gopkg.lock</code></a> の内容は以下の通り。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">projects</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">name</span> <span class="p">=</span> <span class="s2">"github.com/davidminor/gorand"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">packages</span> <span class="p">=</span> <span class="p">[</span><span class="s2">"lcg"</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">revision</span> <span class="p">=</span> <span class="s2">"189780b8053a44a111339a4248394fd844c1da40"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">projects</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">branch</span> <span class="p">=</span> <span class="s2">"master"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">name</span> <span class="p">=</span> <span class="s2">"github.com/davidminor/uint128"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">packages</span> <span class="p">=</span> <span class="p">[</span><span class="s2">"."</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">revision</span> <span class="p">=</span> <span class="s2">"5745f1bf80414e0ad2670e85d6aece8c58031def"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">projects</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">name</span> <span class="p">=</span> <span class="s2">"github.com/inconshreveable/mousetrap"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">packages</span> <span class="p">=</span> <span class="p">[</span><span class="s2">"."</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">revision</span> <span class="p">=</span> <span class="s2">"76626ae9c91c4f2a10f34cad8ce83ea42c93bb75"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">version</span> <span class="p">=</span> <span class="s2">"v1.0"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">projects</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">name</span> <span class="p">=</span> <span class="s2">"github.com/pkg/errors"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">packages</span> <span class="p">=</span> <span class="p">[</span><span class="s2">"."</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">revision</span> <span class="p">=</span> <span class="s2">"248dadf4e9068a0b3e79f02ed0a610d935de5302"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">projects</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">branch</span> <span class="p">=</span> <span class="s2">"master"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">name</span> <span class="p">=</span> <span class="s2">"github.com/seehuhn/mt19937"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">packages</span> <span class="p">=</span> <span class="p">[</span><span class="s2">"."</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">revision</span> <span class="p">=</span> <span class="s2">"98c0ea580d2f3c5a171acf4d4f15321b72209d08"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">projects</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">name</span> <span class="p">=</span> <span class="s2">"github.com/spf13/cobra"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">packages</span> <span class="p">=</span> <span class="p">[</span><span class="s2">"."</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">revision</span> <span class="p">=</span> <span class="s2">"6b74a60562f5c1c920299b8f02d153e16f4897fc"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">projects</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">name</span> <span class="p">=</span> <span class="s2">"github.com/spf13/pflag"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">packages</span> <span class="p">=</span> <span class="p">[</span><span class="s2">"."</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">revision</span> <span class="p">=</span> <span class="s2">"5ccb023bc27df288a957c5e994cd44fd19619465"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">projects</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">name</span> <span class="p">=</span> <span class="s2">"github.com/spiegel-im-spiegel/gocli"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">packages</span> <span class="p">=</span> <span class="p">[</span><span class="s2">"."</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">revision</span> <span class="p">=</span> <span class="s2">"5929f04fb8e4a19ac29fdf658866f9441f339cd9"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">version</span> <span class="p">=</span> <span class="s2">"v0.3.0"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">solve-meta</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">analyzer-name</span> <span class="p">=</span> <span class="s2">"dep"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">analyzer-version</span> <span class="p">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"> <span class="nx">inputs-digest</span> <span class="p">=</span> <span class="s2">"3f9a0c0024e81ba251efaa0cb0014694f8315add84c7e8044a346f370e3e088e"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">solver-name</span> <span class="p">=</span> <span class="s2">"gps-cdcl"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">solver-version</span> <span class="p">=</span> <span class="mi">1</span>
</span></span></code></pre></div><p><code>glide.lock</code> と <a href="https://golang.github.io/dep/docs/Gopkg.lock.html" title="Gopkg.lock · dep"><code>Gopkg.lock</code></a> の内容がマッチしているのが分かると思う。</p>
<div class="box"><strong>【2018-02-02 追記】</strong> dep v0.4 から挙動が変わった?
どうやら <code>dep init</code> 時点でリビジョン管理が必要と判断されるパッケージのみ <code>Gopkg.toml</code> に記載される感じ。
それ以外でリビジョン管理が必要なものは手動で <code>Gopkg.toml</code> に記述する必要があるかも。</div>
<p>念のため <code>dep status</code> も見ておこう。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ dep status
</span></span><span class="line"><span class="cl">PROJECT CONSTRAINT VERSION REVISION LATEST PKGS USED
</span></span><span class="line"><span class="cl">github.com/davidminor/gorand * 189780b 1
</span></span><span class="line"><span class="cl">github.com/davidminor/uint128 branch master branch master 5745f1b 5745f1b 1
</span></span><span class="line"><span class="cl">github.com/inconshreveable/mousetrap v1.0 v1.0 76626ae v1.0 1
</span></span><span class="line"><span class="cl">github.com/pkg/errors * 248dadf 1
</span></span><span class="line"><span class="cl">github.com/seehuhn/mt19937 branch master branch master 98c0ea5 98c0ea5 1
</span></span><span class="line"><span class="cl">github.com/spf13/cobra * 6b74a60 1
</span></span><span class="line"><span class="cl">github.com/spf13/pflag * 5ccb023 1
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/gocli ^0.3.0 v0.3.0 5929f04 v0.3.0 1
</span></span></code></pre></div><p>ビルドもちゃんと通る。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ go build -v .
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/vendor/github.com/davidminor/uint128
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/vendor/github.com/spf13/pflag
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/vendor/github.com/seehuhn/mt19937
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/vendor/github.com/inconshreveable/mousetrap
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/vendor/github.com/spiegel-im-spiegel/gocli
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/vendor/github.com/davidminor/gorand/lcg
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/vendor/github.com/pkg/errors
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/gencmplx
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/qq
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/genpi
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/plot
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/vendor/github.com/spf13/cobra
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/estmt
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/cmd
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi
</span></span></code></pre></div><p>というわけで, <code>glide.yaml</code> と <code>glide.lock</code> が正しい状態で残っていれば問題なく <a href="https://golang.github.io/dep/" title="dep · Dependency management for Go">dep</a> に移行できそうだ。</p>
<h2>依存関係の管理</h2>
<p><a href="https://golang.github.io/dep/docs/Gopkg.toml.html" title="Gopkg.toml · dep"><code>Gopkg.toml</code></a> を以下のように修正してみる。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">constraint</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">name</span> <span class="p">=</span> <span class="s2">"github.com/davidminor/gorand"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">branch</span> <span class="p">=</span> <span class="s2">"master"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">constraint</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">name</span> <span class="p">=</span> <span class="s2">"github.com/pkg/errors"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">version</span> <span class="p">=</span> <span class="s2">"0.8.*"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">constraint</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">name</span> <span class="p">=</span> <span class="s2">"github.com/seehuhn/mt19937"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">branch</span> <span class="p">=</span> <span class="s2">"master"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">constraint</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">name</span> <span class="p">=</span> <span class="s2">"github.com/spf13/cobra"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">version</span> <span class="p">=</span> <span class="s2">"0.0.*"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">constraint</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">name</span> <span class="p">=</span> <span class="s2">"github.com/spiegel-im-spiegel/gocli"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">version</span> <span class="p">=</span> <span class="s2">"0.3.*"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">prune</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">go-tests</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"> <span class="nx">unused-packages</span> <span class="p">=</span> <span class="kc">true</span>
</span></span></code></pre></div><p>この状態で <code>dep ensure</code> コマンドを実行しステータスを見ると,以下のような感じになる。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ dep status
</span></span><span class="line"><span class="cl">PROJECT CONSTRAINT VERSION REVISION LATEST PKGS USED
</span></span><span class="line"><span class="cl">github.com/davidminor/gorand branch master branch master 283446f 283446f 1
</span></span><span class="line"><span class="cl">github.com/davidminor/uint128 branch master branch master 5745f1b 5745f1b 1
</span></span><span class="line"><span class="cl">github.com/inconshreveable/mousetrap v1.0 v1.0 76626ae v1.0 1
</span></span><span class="line"><span class="cl">github.com/pkg/errors ^0.8.0 v0.8.0 645ef00 v0.8.0 1
</span></span><span class="line"><span class="cl">github.com/seehuhn/mt19937 branch master branch master 98c0ea5 98c0ea5 1
</span></span><span class="line"><span class="cl">github.com/spf13/cobra ^0.0.1 v0.0.1 7b2c5ac v0.0.1 1
</span></span><span class="line"><span class="cl">github.com/spf13/pflag * 5ccb023 1
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/gocli ^0.3.0 v0.3.0 5929f04 v0.3.0 1
</span></span></code></pre></div><p>たとえば</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">constraint</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">name</span> <span class="p">=</span> <span class="s2">"github.com/davidminor/gorand"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">branch</span> <span class="p">=</span> <span class="s2">"master"</span>
</span></span></code></pre></div><p>であれば <a href="https://github.com/davidminor/gorand" title="davidminor/gorand: Basic golang implementation of a permuted congruential generator for pseudorandom number generation">github.com/davidminor/gorand</a> パッケージで master ブランチの最新コミットを取ってくる。
また</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">constraint</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">name</span> <span class="p">=</span> <span class="s2">"github.com/spiegel-im-spiegel/gocli"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">version</span> <span class="p">=</span> <span class="s2">"0.3.*"</span>
</span></span></code></pre></div><p>であれば <a href="https://github.com/spiegel-im-spiegel/gocli" title="spiegel-im-spiegel/gocli: Command line interface">spiegel-im-spiegel/gocli</a> パッケージで v0.3.x の最新バージョンを取ってくる<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>。</p>
<p><code>[prune]</code> 指定では <code>vendor/</code> フォルダから除外するパッケージやファイルを指定する。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">prune</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">go-tests</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"> <span class="nx">unused-packages</span> <span class="p">=</span> <span class="kc">true</span>
</span></span></code></pre></div><p><code>go-tests</code> はテスト用のファイル(<code>*_test.go</code>)を <code>unused-packages</code> は未使用のパッケージを指す。
なお,値は <code>true</code> 以外はエラーになるようだ。
たとえば未使用パッケージも含めたいのであれば <code>unused-packages = false</code> とするのではなく記述自体を削除する。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">prune</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">go-tests</span> <span class="p">=</span> <span class="kc">true</span>
</span></span></code></pre></div><h2>依存関係の視覚化</h2>
<p><code>dep status</code> コマンドには結果を DOT 言語で吐き出すオプションがあるようだ。
<a href="http://graphviz.org/" title="Graphviz - Graph Visualization Software">Graphviz</a> があれば,この出力結果を画像データに変換できる。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ dep status -dot | dot -Tpng -o pi-dependency.png
</span></span></code></pre></div><p>結果はこんな感じ。</p>
<figure style='margin:0 auto;text-align:center;'><a href="./pi-dependency.png"><img src="./pi-dependency.png" srcset="./pi-dependency.png 1275w" sizes="(min-width:600px) 500px, 80vw" alt="pi-dependency.png" loading="lazy"></a><figcaption><div><a href="./pi-dependency.png">pi-dependency.png</a></div></figcaption>
</figure>
<p>ブラボー!</p>
<h2>リポジトリへのパスを直接指定する</h2>
<p>GitHub みたいな有名 SaaS に置いてあるパッケージなら <a href="https://golang.github.io/dep/docs/Gopkg.toml.html" title="Gopkg.toml · dep"><code>Gopkg.toml</code></a> に</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">constraint</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">name</span> <span class="p">=</span> <span class="s2">"github.com/spiegel-im-spiegel/gocli"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">version</span> <span class="p">=</span> <span class="s2">"0.3.*"</span>
</span></span></code></pre></div><p>とか書けば適切に処理してくれるけど,有名でない SaaS ディレクトリや職場 LAN のリポジトリ上のパッケージではこうはいかないこともある。
こういう場合には,以下に示す通り,直接リポジトリへの(プロトコルを含めた)パスを指定する。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">constraint</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">name</span> <span class="p">=</span> <span class="s2">"github.com/spiegel-im-spiegel/gocli"</span>
</span></span><span class="line hl"><span class="cl"> <span class="nx">source</span> <span class="p">=</span> <span class="s2">"git@github.com:spiegel-im-spiegel/gocli.git"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">version</span> <span class="p">=</span> <span class="s2">"0.3.* "</span></span></span></code></pre></div>
<p>これで <code>dep ensure</code> すれば</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ dep ensure -v
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl">
</span></span><span class="line hl"><span class="cl">(1/8) Wrote github.com/spiegel-im-spiegel/gocli (from git@github.com:spiegel-im-spiegel/gocli.git)@v0.3.0
</span></span><span class="line"><span class="cl">(2/8) Wrote github.com/pkg/errors@248dadf4e9068a0b3e79f02ed0a610d935de5302
</span></span><span class="line"><span class="cl">(3/8) Wrote github.com/davidminor/gorand@189780b8053a44a111339a4248394fd844c1da40
</span></span><span class="line"><span class="cl">(4/8) Wrote github.com/spf13/pflag@5ccb023bc27df288a957c5e994cd44fd19619465
</span></span><span class="line"><span class="cl">(5/8) Wrote github.com/inconshreveable/mousetrap@v1.0
</span></span><span class="line"><span class="cl">(6/8) Wrote github.com/davidminor/uint128@master
</span></span><span class="line"><span class="cl">(7/8) Wrote github.com/spf13/cobra@6b74a60562f5c1c920299b8f02d153e16f4897fc
</span></span><span class="line"><span class="cl">(8/8) Wrote github.com/seehuhn/mt19937@master</span></span></code></pre></div>
<p>といった感じになる。
ちゃんと指定したリポジトリからパッケージを取得してきているのが分かるだろう。</p>
<h2>Go 1.9 から glide novendor は必要なくなった</h2>
<p>Vendoring で一番あつかいに困るのがテストで,たとえば安直に</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ go test -v ./...
</span></span></code></pre></div><p>とかやると <code>vendor/</code> フォルダ以下のパッケージまでテスト・シーケンスが走ってしまうのが困りものであった。
このため <a href="https://github.com/Masterminds/glide" title="Masterminds/glide">glide</a> にはこれを回避する <code>glide novendor</code> コマンドがあって</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ go test -v $(glide novendor)
</span></span></code></pre></div><p>とすることで <code>vendor/</code> フォルダへのテストを回避できるようになっていたのだ<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>。</p>
<p>ところがところが!!</p>
<p><a href="https://golang.org/" title="The Go Programming Language">Go 言語</a> 1.9 からは <code>./...</code> の扱いが変更になり</p>
<figure lang="en">
<blockquote>“By popular request, <code>./...</code> no longer matches packages in <code>vendor</code> directories in tools accepting package names, such as <code>go test</code>.”</blockquote>
<figcaption><div>via <q><a href="https://golang.org/doc/go1.9#vendor-dotdotdot">Go 1.9 Release Notes</a></q></div></figcaption>
</figure>
<p>ということで <code>./...</code> に <code>vendor/</code> フォルダ以下が含まれないことになったのだ。
たとえば <a href="https://github.com/spiegel-im-spiegel/pi" title="spiegel-im-spiegel/pi: Estimate of Pi with Monte Carlo method.">spiegel-im-spiegel/pi</a> パッケージの場合は</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ go list ./...
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/cmd
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/estmt
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/gencmplx
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/genpi
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/plot
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/qq
</span></span></code></pre></div><p>となる。
逆に <code>vendor/</code> フォルダも含めたいなら</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ go list ./... ./vendor/...
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/cmd
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/estmt
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/gencmplx
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/genpi
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/plot
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/qq
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/vendor/github.com/davidminor/gorand/lcg
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/vendor/github.com/davidminor/gorand/pcg
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/vendor/github.com/davidminor/uint128
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/vendor/github.com/inconshreveable/mousetrap
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/vendor/github.com/pkg/errors
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/vendor/github.com/seehuhn/mt19937
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/vendor/github.com/spf13/cobra
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/vendor/github.com/spf13/cobra/cobra
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/vendor/github.com/spf13/cobra/cobra/cmd
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/vendor/github.com/spf13/cobra/doc
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/vendor/github.com/spf13/pflag
</span></span><span class="line"><span class="cl">github.com/spiegel-im-spiegel/pi/vendor/github.com/spiegel-im-spiegel/gocli
</span></span></code></pre></div><p>とすればよい。
こっちのほうが遥かに扱いやすいよね。</p>
<p>これでまたひとつ <a href="https://github.com/Masterminds/glide" title="Masterminds/glide">glide</a> が「要らない子」になる理由が増えてしまったのだった。</p>
<h2>ブックマーク</h2>
<ul>
<li>
<p><a href="https://dev.classmethod.jp/go/dep/">Goオフィシャルチーム作成の依存関係管理ツール dep を試してみた | Developers.IO</a></p>
</li>
<li>
<p><a href="https://mattn.kaoriya.net/software/lang/go/20170125023240.htm">Big Sky :: golang オフィシャル謹製のパッケージ依存解決ツール「dep」</a></p>
</li>
<li>
<p><a href="https://qiita.com/noppefoxwolf/items/49bd460034a5c84e1956">[go]depでブランチ指定 - Qiita</a></p>
<ul>
<li><a href="https://golang.github.io/dep/docs/ensure-mechanics.html">Models and Mechanisms · dep</a></li>
</ul>
</li>
<li>
<p><a href="https://text.baldanders.info/golang/gopath-pollution/">GOPATH 汚染問題</a></p>
</li>
<li>
<p><a href="https://text.baldanders.info/golang/package-visualization-tool/">パッケージの依存状況の視覚化</a></p>
</li>
</ul>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Windows 7 の場合は “<a href="https://www.microsoft.com/ja-jp/download/details.aspx?id=40855">Windows Management Framework 4.0</a>” をインストールすることで PowerShell 4.0 にアップグレードできる。 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2">
<p><a href="https://golang.github.io/dep/docs/Gopkg.toml.html" title="Gopkg.toml · dep"><code>Gopkg.toml</code></a> のバージョンの考え方は “<a href="http://semver.org/" title="Semantic Versioning 2.0.0 | Semantic Versioning">Semantic Versioning</a>” に従っている。ワイルドカード等を使ったバージョン指定については <a href="https://github.com/Masterminds/semver" title="Masterminds/semver: Work with Semantic Versions in Go">Masterminds/semver</a> パッケージを参照するとよい。 <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3">
<p><a href="https://github.com/Masterminds/glide" title="Masterminds/glide">glide</a> を使わない場合は <code>go test -v $(go list ./... | grep -v /vendor/)</code> とかする。どのみち Windows のコマンドプロンプトでは無理だけど(笑) <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
Glide で Vendoring
tag:text.Baldanders.info,2015-12-07:/golang/vendoring-with-glide/
2015-12-07T14:30:21+00:00
2019-07-01T13:48:09+00:00
Go 言語 1.5 の vendoring 機能をサポートするツールが glide である。
Spiegel
https://baldanders.info/profile/
<p><strong>【2017-10-10 追記】</strong>
<a href="https://github.com/Masterminds/glide" title="Masterminds/glide">glide</a> プロジェクトは Vendoring ツールとして公式ツールの <a href="https://github.com/golang/dep" title="golang/dep: Go dependency management tool">dep</a> を推し始めたようである。</p>
<ul>
<li><a href="https://text.baldanders.info/golang/consider-switching-from-glide-to-dep/">Glide から Dep への移行を検討する</a></li>
</ul>
<p>そこで当セクションでも今後は <a href="https://github.com/golang/dep" title="golang/dep: Go dependency management tool">dep</a> を推していくことにする。
この記事はメンテナンスされない可能性があるが,あしからずご了承の程を。</p>
<hr>
<p>以前「<a href="https://text.baldanders.info/golang/gopath-pollution/">GOPATH 汚染問題</a>」で <a href="https://golang.org/" title="The Go Programming Language">Go 言語</a> 1.5 の vendoring 機能を紹介したが,この vendoring のヘルパ・ツールと言えるのが <a href="https://github.com/Masterminds/glide" title="Masterminds/glide">glide</a> である。
<a href="https://github.com/Masterminds/glide" title="Masterminds/glide">glide</a> では依存する外部パッケージの情報を YAML 形式の定義ファイルに記述し,この定義ファイルを基に外部パッケージの管理を行う。</p>
<p>(<a href="https://github.com/Masterminds/glide" title="Masterminds/glide">glide</a> 0.8 から挙動が少し変わった。
この記事では 0.8.2 を使っている)</p>
<h2>Glide のインストール</h2>
<p><a href="https://github.com/Masterminds/glide" title="Masterminds/glide">glide</a> は自身も <a href="https://github.com/Masterminds/glide" title="Masterminds/glide">glide</a> で外部パッケージを管理している。
なので最初は <code>go get</code> ではなく <a href="https://github.com/Masterminds/glide/releases">Releases</a> ページからビルド済みのものを取得することをお勧めする<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。</p>
<p>既に <a href="https://github.com/Masterminds/glide" title="Masterminds/glide">glide</a> が利用可能な状態なら,以下の要領でビルドできる。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">C:\workspace\glide>SET GOPATH=C:\workspace\glide
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">C:\workspace\glide>SET GO15VENDOREXPERIMENT=1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">C:\workspace\glide>git clone git@github.com:Masterminds/glide.git src\github.com\Masterminds\glide
</span></span><span class="line"><span class="cl">Cloning into 'src\github.com\Masterminds\glide'...
</span></span><span class="line"><span class="cl">remote: Counting objects: 2292, done.
</span></span><span class="line"><span class="cl">remote: Compressing objects: 100% (65/65), done.
</span></span><span class="line"><span class="cl">remote: Total 2292 (delta 34), reused 0 (delta 0), pack-reused 2292
</span></span><span class="line"><span class="cl">Receiving objects: 100% (2292/2292), 468.01 KiB | 397.00
</span></span><span class="line"><span class="cl">Receiving objects: 100% (2292/2292), 537.97 KiB | 397.00 KiB/s, done.
</span></span><span class="line"><span class="cl">Resolving deltas: 100% (1578/1578), done.
</span></span><span class="line"><span class="cl">Checking connectivity... done.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">C:\workspace\glide>pushd src\github.com\Masterminds\glide
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">C:\workspace\glide\src\github.com\Masterminds\glide>glide install
</span></span><span class="line"><span class="cl">[INFO] Fetching updates for github.com/codegangsta/cli.
</span></span><span class="line"><span class="cl">[INFO] Fetching updates for github.com/Masterminds/cookoo.
</span></span><span class="line"><span class="cl">[INFO] Fetching updates for github.com/Masterminds/vcs.
</span></span><span class="line"><span class="cl">[INFO] Fetching updates for gopkg.in/yaml.v2.
</span></span><span class="line"><span class="cl">[INFO] Fetching updates for github.com/Masterminds/semver.
</span></span><span class="line"><span class="cl">[INFO] Setting version for github.com/Masterminds/cookoo to 78aa11ce75e257c51be7ea945edb84cf19c4a6de.
</span></span><span class="line"><span class="cl">[INFO] Setting version for github.com/Masterminds/semver to 6333b7bd29aad1d79898ff568fd90a8aa533ae82.
</span></span><span class="line"><span class="cl">[INFO] Setting version for github.com/codegangsta/cli to b5232bb2934f606f9f27a1305f1eea224e8e8b88.
</span></span><span class="line"><span class="cl">[INFO] Setting version for github.com/Masterminds/vcs to eaee272c8fa4514e1572e182faecff5be20e792a.
</span></span><span class="line"><span class="cl">[INFO] Setting version for gopkg.in/yaml.v2 to f7716cbe52baa25d2e9b0d0da546fcf909fc16b4.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">C:\workspace\glide\src\github.com\Masterminds\glide>popd
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">C:\workspace\glide>go install -v ./...
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/vendor/github.com/Masterminds/cookoo/io
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/msg
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/gb
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/vendor/gopkg.in/yaml.v2
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/vendor/github.com/Masterminds/semver
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/vendor/github.com/codegangsta/cli
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/vendor/github.com/Masterminds/cookoo/safely
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/vendor/github.com/Masterminds/vcs
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/vendor/github.com/Masterminds/cookoo
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/vendor/github.com/Masterminds/cookoo/cli
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/vendor/github.com/Masterminds/cookoo/database/sql
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/vendor/github.com/Masterminds/cookoo/database/active
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/vendor/github.com/Masterminds/cookoo/convert
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/vendor/github.com/Masterminds/cookoo/fmt
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/vendor/github.com/Masterminds/cookoo/web
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/vendor/github.com/Masterminds/cookoo/example
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/vendor/github.com/Masterminds/cookoo/log
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/vendor/github.com/Masterminds/cookoo/web/auth
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/util
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/vendor/github.com/Masterminds/cookoo/doc
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/cfg
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/dependency
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide/cmd
</span></span><span class="line"><span class="cl">github.com/Masterminds/glide
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">C:\workspace\glide>bin\glide.exe -v
</span></span><span class="line"><span class="cl">glide version dev
</span></span></code></pre></div><p>簡単な使い方は以下の通り。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">C:> glide -h
</span></span><span class="line"><span class="cl">NAME:
</span></span><span class="line"><span class="cl"> glide - The lightweight vendor package manager for your Go projects.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Each project should have a 'glide.yaml' file in the project directory. Files
</span></span><span class="line"><span class="cl">look something like this:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> package: github.com/Masterminds/glide
</span></span><span class="line"><span class="cl"> imports:
</span></span><span class="line"><span class="cl"> - package: github.com/Masterminds/cookoo
</span></span><span class="line"><span class="cl"> vcs: git
</span></span><span class="line"><span class="cl"> ref: 1.1.0
</span></span><span class="line"><span class="cl"> subpackages: **
</span></span><span class="line"><span class="cl"> - package: github.com/kylelemons/go-gypsy
</span></span><span class="line"><span class="cl"> subpackages: yaml
</span></span><span class="line"><span class="cl"> flatten: true
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">NOTE: As of Glide 0.5, the commands 'in', 'into', 'gopath', 'status', and 'env'
</span></span><span class="line"><span class="cl">no longer exist.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">USAGE:
</span></span><span class="line"><span class="cl"> glide [global options] command [command options] [arguments...]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">VERSION:
</span></span><span class="line"><span class="cl"> 0.8.2
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">COMMANDS:
</span></span><span class="line"><span class="cl"> create, init Initialize a new project, creating a glide.yaml file
</span></span><span class="line"><span class="cl"> get Install one or more packages into `vendor/` and add dependency to glide.yaml.
</span></span><span class="line"><span class="cl"> import Import files from other dependency management systems.
</span></span><span class="line"><span class="cl"> name Print the name of this project.
</span></span><span class="line"><span class="cl"> novendor, nv List all non-vendor paths in a directory.
</span></span><span class="line"><span class="cl"> rebuild Rebuild ('go build') the dependencies
</span></span><span class="line"><span class="cl"> install, i Install a project's dependencies
</span></span><span class="line"><span class="cl"> update, up Update a project's dependencies
</span></span><span class="line"><span class="cl"> tree Tree prints the dependencies of this project as a tree.
</span></span><span class="line"><span class="cl"> list List prints all dependencies that Glide could discover.
</span></span><span class="line"><span class="cl"> about Learn about Glide
</span></span><span class="line"><span class="cl"> help, h Shows a list of commands or help for one command
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">GLOBAL OPTIONS:
</span></span><span class="line"><span class="cl"> --yaml, -y "glide.yaml" Set a YAML configuration file.
</span></span><span class="line"><span class="cl"> --quiet, -q Quiet (no info or debug messages)
</span></span><span class="line"><span class="cl"> --debug Print Debug messages (verbose)
</span></span><span class="line"><span class="cl"> --home "C:\Users\username\.glide" The location of Glide files [$GLIDE_HOME]
</span></span><span class="line"><span class="cl"> --no-color Turn off colored output for log messages
</span></span><span class="line"><span class="cl"> --help, -h show help
</span></span><span class="line"><span class="cl"> --version, -v print the version
</span></span></code></pre></div><h2>開発環境の準備</h2>
<p>動作検証用に「<a href="https://text.baldanders.info/golang/gopath-pollution/">GOPATH 汚染問題</a>」で使ったコードを利用する。
まず,以下の環境を作る。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">C:\workspace\vdemo2>SET GOPATH=C:\workspace\vdemo2
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">C:\workspace\vdemo2>SET GO15VENDOREXPERIMENT=1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">C:\workspace\vdemo2>tree /f .
</span></span><span class="line"><span class="cl">C:\WORKSPACE\VDEMO2
</span></span><span class="line"><span class="cl">└─src
</span></span><span class="line"><span class="cl"> └─julian-day
</span></span><span class="line"><span class="cl"> julian-day.go
</span></span></code></pre></div><p><code>julian-day.go</code> の内容は以下のとおりである。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s">"flag"</span>
</span></span><span class="line"><span class="cl"> <span class="s">"fmt"</span>
</span></span><span class="line"><span class="cl"> <span class="s">"os"</span>
</span></span><span class="line"><span class="cl"> <span class="s">"strconv"</span>
</span></span><span class="line"><span class="cl"> <span class="s">"time"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="s">"github.com/spiegel-im-spiegel/astrocalc/modjulian"</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="c1">//引数のチェック
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="nx">flag</span><span class="p">.</span><span class="nf">Parse</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="nx">argsStr</span> <span class="o">:=</span> <span class="nx">flag</span><span class="p">.</span><span class="nf">Args</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nx">argsStr</span><span class="p">)</span> <span class="p"><</span> <span class="mi">3</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Fprintln</span><span class="p">(</span><span class="nx">os</span><span class="p">.</span><span class="nx">Stderr</span><span class="p">,</span> <span class="s">"年月日を指定してください"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="nx">args</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">([]</span><span class="kt">int</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="nx">i</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="p"><</span> <span class="mi">3</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">num</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">strconv</span><span class="p">.</span><span class="nf">Atoi</span><span class="p">(</span><span class="nx">argsStr</span><span class="p">[</span><span class="nx">i</span><span class="p">])</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Fprintln</span><span class="p">(</span><span class="nx">os</span><span class="p">.</span><span class="nx">Stderr</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="nx">args</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="p">=</span> <span class="nx">num</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="nx">tm</span> <span class="o">:=</span> <span class="nx">time</span><span class="p">.</span><span class="nf">Date</span><span class="p">(</span><span class="nx">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nx">time</span><span class="p">.</span><span class="nf">Month</span><span class="p">(</span><span class="nx">args</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span> <span class="nx">args</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">time</span><span class="p">.</span><span class="nx">UTC</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">"%v\n"</span><span class="p">,</span> <span class="nx">tm</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">"MJD = %d日\n"</span><span class="p">,</span> <span class="nx">modjulian</span><span class="p">.</span><span class="nf">DayNumber</span><span class="p">(</span><span class="nx">tm</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>当然ながら,このままビルドしても外部パッケージがないため失敗する。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">C:\workspace\vdemo2>go install ./...
</span></span><span class="line"><span class="cl">src\julian-day\julian-day.go:10:2: cannot find package "github.com/spiegel-im-spiegel/astrocalc/modjulian" in any of:
</span></span><span class="line"><span class="cl"> C:\Go\src\github.com\spiegel-im-spiegel\astrocalc\modjulian (from $GOROOT)
</span></span><span class="line"><span class="cl"> C:\workspace\vdemo2\src\github.com\spiegel-im-spiegel\astrocalc\modjulian (from $GOPATH)
</span></span></code></pre></div><h2>依存関係を定義する</h2>
<p>開発環境ができたら,パッケージのフォルダ(今回は <code>src/julian-day</code>)に移動し, <code>glide create</code> コマンドで依存関係を定義する <code>glide.yaml</code> ファイルを生成する。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">C:\workspace\vdemo2>pushd src\julian-day
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">C:\workspace\vdemo2\src\julian-day>glide create
</span></span><span class="line"><span class="cl">[INFO] Generating a YAML configuration file and guessing the dependencies
</span></span><span class="line"><span class="cl">[INFO] Attempting to import from other package managers (use --skip-import to skip)
</span></span><span class="line"><span class="cl">[INFO] Found reference to github.com\spiegel-im-spiegel\astrocalc\modjulian
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">C:\workspace\vdemo2\src\julian-day>tree /f C:\workspace\vdemo2
</span></span><span class="line"><span class="cl">C:\WORKSPACE\VDEMO2
</span></span><span class="line"><span class="cl">└─src
</span></span><span class="line"><span class="cl"> └─julian-day
</span></span><span class="line"><span class="cl"> glide.yaml
</span></span><span class="line"><span class="cl"> julian-day.go
</span></span></code></pre></div><p>ソースコードを読んで <code>glide.yaml</code> に必要な情報を推測して書いてくれているようだが<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>,デリミタが “/” じゃなくて “\” になってる。
Windows 環境だからかな。
残念 orz</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">package</span><span class="p">:</span><span class="w"> </span><span class="l">julian-day</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">import</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">package</span><span class="p">:</span><span class="w"> </span><span class="l">github.com\spiegel-im-spiegel\astrocalc\modjulian</span><span class="w">
</span></span></span></code></pre></div><p><a href="https://github.com/spiegel-im-spiegel/astrocalc" title="spiegel-im-spiegel/astrocalc">astrocalc</a>/modjulian パッケージのパスを修正して、更にバージョン情報を追加する。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">package</span><span class="p">:</span><span class="w"> </span><span class="l">julian-day</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">import</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">package</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/spiegel-im-spiegel/astrocalc/modjulian</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">v0.1.0</span><span class="w">
</span></span></span></code></pre></div><p>これで <code>go get</code> コマンドと同じように, <code>package</code> のパスから自動的に repository を判別してパッケージを取得できる。
<code>go get</code> コマンドと異なるのは, <code>glide.yaml</code> ファイルで指定した <code>version</code> 情報から適切な revision を選択できる点である<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>。</p>
<p>また,以下のように VCS (Version Control System) の種類<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup> と URI を明示的に指定することもできる(<code>vcs</code> と <code>repo</code> は必ずセットで指定する)。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">package</span><span class="p">:</span><span class="w"> </span><span class="l">julian-day</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">import</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">package</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/spiegel-im-spiegel/astrocalc/modjulian</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">vcs</span><span class="p">:</span><span class="w"> </span><span class="l">git</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">repo</span><span class="p">:</span><span class="w"> </span><span class="l">git@github.com:spiegel-im-spiegel/astrocalc.git</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">v0.1.0</span><span class="w">
</span></span></span></code></pre></div><p>たとえば,プライベートな bare repository からインポートする場合には,この方法が有効である。</p>
<h2>パッケージの取得とビルド</h2>
<p>パッケージの取得には <code>glide update</code> または <code>glide up</code> コマンドを起動する。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">C:\workspace\vdemo2\src\julian-day>glide up
</span></span><span class="line"><span class="cl">[INFO] Fetching updates for github.com/spiegel-im-spiegel/astrocalc.
</span></span><span class="line"><span class="cl">[INFO] Setting version for github.com/spiegel-im-spiegel/astrocalc to v0.1.0.
</span></span><span class="line"><span class="cl">[INFO] Scanning github.com/spiegel-im-spiegel/astrocalc for dependencies.
</span></span><span class="line"><span class="cl">[INFO] Setting version for github.com/spiegel-im-spiegel/astrocalc to v0.1.0.
</span></span><span class="line"><span class="cl">[INFO] Project relies on 1 dependencies.
</span></span><span class="line"><span class="cl">[INFO] Writing glide.lock file
</span></span><span class="line"><span class="cl">C:\workspace\vdemo2\src\julian-day>tree /f C:\workspace\vdemo2
</span></span><span class="line"><span class="cl">C:\WORKSPACE\VDEMO2
</span></span><span class="line"><span class="cl">└─src
</span></span><span class="line"><span class="cl"> └─julian-day
</span></span><span class="line"><span class="cl"> │ glide.lock
</span></span><span class="line"><span class="cl"> │ glide.yaml
</span></span><span class="line"><span class="cl"> │ julian-day.go
</span></span><span class="line"><span class="cl"> │
</span></span><span class="line"><span class="cl"> └─vendor
</span></span><span class="line"><span class="cl"> └─github.com
</span></span><span class="line"><span class="cl"> └─spiegel-im-spiegel
</span></span><span class="line"><span class="cl"> └─astrocalc
</span></span><span class="line"><span class="cl"> │ .editorconfig
</span></span><span class="line"><span class="cl"> │ .gitignore
</span></span><span class="line"><span class="cl"> │ .travis.yml
</span></span><span class="line"><span class="cl"> │ LICENSE
</span></span><span class="line"><span class="cl"> │ README.md
</span></span><span class="line"><span class="cl"> │
</span></span><span class="line"><span class="cl"> └─modjulian
</span></span><span class="line"><span class="cl"> example_test.go
</span></span><span class="line"><span class="cl"> LICENSE
</span></span><span class="line"><span class="cl"> modjulian.go
</span></span><span class="line"><span class="cl"> modjulian_test.go
</span></span></code></pre></div><p>これでビルドが可能になった。
ではビルドしようかな。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">C:\workspace\vdemo2\src\julian-day>popd
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">C:\workspace\vdemo2>go install -v ./...
</span></span><span class="line"><span class="cl">julian-day/vendor/github.com/spiegel-im-spiegel/astrocalc/modjulian
</span></span><span class="line"><span class="cl">julian-day
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">C:\workspace\vdemo2>bin\julian-day.exe 2015 1 1
</span></span><span class="line"><span class="cl">2015-01-01 00:00:00 +0000 UTC
</span></span><span class="line"><span class="cl">MJD = 57023日
</span></span></code></pre></div><p>よーし,うむうむ,よーし。</p>
<h2>Vendor フォルダの管理</h2>
<p><code>glide.lock</code> ファイルには外部パッケージの状態が記述されている。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">hash</span><span class="p">:</span><span class="w"> </span><span class="l">b1eecd43769aa1225f7b8922a35566008561c64f4ce11180f299888ed153ad69</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">updated</span><span class="p">:</span><span class="w"> </span><span class="ld">2015-12-23T10:47:22.4140434</span><span class="m">+09</span><span class="p">:</span><span class="m">00</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">imports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/spiegel-im-spiegel/astrocalc</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">256cd3bd4dc63441d3f4759d761593a147d51d88</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">subpackages</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">modjulian</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">devImports</span><span class="p">:</span><span class="w"> </span><span class="p">[]</span><span class="w">
</span></span></span></code></pre></div><p><code>glide.lock</code> があれば <code>glide install</code>(または <code>glide i</code>)コマンドで <code>vendor</code> フォルダ以下の状態を復元できる。</p>
<p><a href="https://github.com/Masterminds/glide" title="Masterminds/glide">glide</a> では外部パッケージを vendor フォルダ以下に repository 構造ごと展開する。
この場合,開発対象のパッケージも repository で管理しているのだから, repository が入れ子になり具合が悪い。
その辺,当の <a href="https://github.com/Masterminds/glide" title="Masterminds/glide">glide</a> はどうしてるのかなぁと思ったら <code>.gitignore</code> ファイルで <code>vendor/</code> を除外対象にしていた。
なるほど,そりゃそうか。</p>
<p><code>glide.yaml</code> および <code>glide.lock</code> ファイルの管理さえちゃんとしていれば <code>glide install</code> コマンドでいつでも復元できるのだから <code>vendor</code> フォルダ以下を除外しても問題ないわけだ<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup>。
これは複数メンバで開発環境を共有する際には便利な機能である。</p>
<p>また vendoring に対応していない(Go 1.4 以下の)環境や <a href="https://github.com/Masterminds/glide" title="Masterminds/glide">glide</a> がない環境では <code>go get</code> で外部パッケージを取ってくることで(revision 等の問題はあるけど)一応ビルドは通る。</p>
<p>更に言うと, <a href="https://github.com/Masterminds/glide" title="Masterminds/glide">glide</a> は <a href="https://golang.org/" title="The Go Programming Language">Go 言語</a>の標準機能に準拠しているため,他のサポートツールとの相性がいいのも利点だろう。
たとえば, <a href="https://text.baldanders.info/golang/golang-with-atom/">ATOM ベースの開発環境</a>は <a href="https://github.com/Masterminds/glide" title="Masterminds/glide">glide</a> と相性がいい<sup id="fnref:6"><a href="#fn:6" class="footnote-ref" role="doc-noteref">6</a></sup>。
あと,(多少強引な手を使っているが<sup id="fnref:7"><a href="#fn:7" class="footnote-ref" role="doc-noteref">7</a></sup>) <a href="https://travis-ci.org/">Travis CI</a> のような CI (Continuous Integration) と組み合わせることも難しくない。</p>
<p>こう考えると <a href="https://github.com/Masterminds/glide" title="Masterminds/glide">glide</a> は<a href="https://text.baldanders.info/golang/project-based-development/">前に紹介</a>した <a href="http://getgb.io/">gb</a> よりも筋がいいツールといえるかもしれない。</p>
<h2>おまけ: vender フォルダ以下をテストから除外する</h2>
<p>テストを行う際に普通に</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ go test -v ./...
</span></span></code></pre></div><p>とかやると <code>vendor</code> フォルダ以下も対象になってしまう。
<code>vendor</code> フォルダ以下を除外したいのであれば</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ go test -v $(glide novendor)
</span></span></code></pre></div><p>とすればよい。</p>
<p>ただこれ Windows のコマンドプロンプトでは使えないんだよねぇ。
パイプで <code>go test</code> に渡してもうまくいかない感じ。
そういう場合は <code>glide novendor</code> の実行結果を整形してバッチファイルにするしかないのだろう。
やれやれ。</p>
<h2>ブックマーク</h2>
<ul>
<li><a href="http://qiita.com/tienlen/items/8e192e68d6b18bec3b4a">glide - パッケージ管理のお困りの方へ - - Qiita</a></li>
<li><a href="http://qiita.com/ktsujichan/items/c78e2515c459316cb1f6">Golangでプロジェクト内のテストを全件実行する - Qiita</a></li>
</ul>
<p><a href="https://text.baldanders.info/golang/bookmark/">Go 言語に関するブックマーク集はこちら</a>。</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Mac 環境なら brew でインストールできるらしい。 Linux 等の環境であれば <code>make</code> コマンドで各種プラットフォームの実行ファイルをビルドできる。一応 <code>go get</code> でもビルドできるが, revision を制御できないので失敗する可能性もある(これは <code>make</code> コマンドでビルドする場合でも同じだけど)。 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2">
<p><code>glide create</code> 時の依存パッケージの推測を抑止するには <code>--skip-import</code> オプションを付ける。のだが,効いてないな。 <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3">
<p>今回であれば repository の <a href="https://github.com/spiegel-im-spiegel/astrocalc/releases/tag/v0.1.0"><code>v0.1.0</code></a> タグに対応する revision を選択する。バージョンの記述形式は <code>package.json</code> と同じように記述でき,バージョンの解釈は <a href="http://semver.org/">Semantic Versioning</a> に従っている。ちなみに revision ID を直接指定することもできる。 <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:4">
<p><a href="https://github.com/Masterminds/glide" title="Masterminds/glide">glide</a> では <a href="http://git-scm.com/">git</a> のほか svn (<a href="http://subversion.apache.org/">Subversion</a>), hg (<a href="http://mercurial.selenic.com/">Mercurial</a>), bzr (<a href="http://bazaar.canonical.com/">Bazaar</a>) が利用可能である。 <a href="#fnref:4" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:5">
<p><code>vendor</code> フォルダ以下は外部パッケージなので通常はさわることはない。 <a href="#fnref:5" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:6">
<p>残念ながら,「<a href="https://text.baldanders.info/golang/package-visualization-tool/">パッケージの依存状況の視覚化</a>」ツールは vendoring 機能に対応していないため上手く表示できない。なお, <a href="https://github.com/Masterminds/glide" title="Masterminds/glide">glide</a> では <code>glide list</code> および <code>glide tree</code> で依存パッケージを見ることができる。 <a href="#fnref:6" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:7">
<p><a href="https://github.com/Masterminds/glide" title="Masterminds/glide">glide</a> の <a href="https://github.com/Masterminds/glide/blob/master/.travis.yml"><code>.travis.yml</code></a> や <a href="https://github.com/Masterminds/glide/blob/master/Makefile"><code>Makefile</code></a> を参照。 <a href="#fnref:7" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>