2017/01/25

Recent entries from same category

  1. Go 言語プログラミングエッセンスという本を書きました。
  2. errors.Join が入った。
  3. unsafe.StringData、unsafe.String、unsafe.SliceData が入った。
  4. Re: Go言語で画像ファイルか確認してみる
  5. net/url に JoinPath が入った。

golang にはパッケージマネージャが無数にあります。

PackageManagementTools · golang/go Wiki · GitHub

Home Articles Blogs Books BoundingResourceUse cgo ChromeOS CodeReview CodeReviewComments CodeTools C...

https://github.com/golang/go/wiki/PackageManagementTools

僕もその一つの gom というのを開発している訳ですが、どれもこれも一長一短でなかなか全ての要望を応えられる物がないのが現状だったりします。ただし、開発者がやりたい事は

今 GOPATH にある、うまくビルドできるバージョンに依存したい

ただこれだけなのです。なんで golang はオフィシャルがこの手のツールを出してくれないんだろう、そう思っていた人も多いと思います。が、それは昨日までの話。

GitHub - golang/dep: Go dependency tool

See the help text for much more detailed usage instructions. Note that the manifest and lock file fo...

https://github.com/golang/dep

でたー!みんな待ってた。そしていつもながら他のツールと名前がバッティングしそうなこの名前の短さ!

使い方も簡単です。まずプロジェクトを作ったら

$ dep init

を実行します。すると lock.jsonmanifest.json Gopkg.tomlGopkg.lock が生成されます。この時点では中身はほぼ空っぽです。試しに以下のコードを書いてみます。

package main

import (
    "github.com/mattn/go-runewidth"
)

func main() {
    println(runewidth.StringWidth("あ"))
}

そして以下を実行。

$ dep ensure

すると lock.json が更新されます。

{
    "memo": "e3dcff295c3782f2465033314eee2342535b0a792a61ebf41e0deeab5747a0e7",
    "projects": [
        {
            "name": "github.com/mattn/go-runewidth",
            "version": "v0.0.1",
            "revision": "d6bea18f789704b5f83375793155289da36a3c7f",
            "packages": [
                "."
            ]
        }
    ]
}

dep status を実行すると、go-runewidth の特定のバージョンで stick されているのが分かるかと思います。では試しに

PROJECT                        CONSTRAINT  VERSION  REVISION  LATEST  PKGS USED
github.com/mattn/go-runewidth  *           v0.0.1   d6bea18   v0.0.1  1  

試しに vendor ディレクトリを削除して、go-runewidth のリポジトリで別ブランチに切り替えておきます。そして再度 dep ensure を実行すると、ちゃんと stick したバージョンがよみがえる!

これや!ワイはこれが欲しかったんや!

今のところ、init と status と ensure と remove しかサブコマンドがありませんが、おそらく今後色々と増えてくるんじゃないかなーと思っています。チョー期待してます。

ちなみにいずれ go のサブコマンド(go dep)の様に取り込まれる可能性があるので慎重派の人はしばらくは遊ぶ程度にしておいた方が良さそう。

Posted at by | Edit