はじめに
GoはWebAPI的に使っているもののあまりディープな話はできないなと思い、Vendoringについて調べて書いておこうって感じです。
ほとんどPackageManagementTools · golang/go Wikiを見て書こうとしているのでご存知の方はスルー願います。
また多くのパッケージ管理ツールは今回初めて触っているので認識が間違っていましたら記事の編集リクエストお願いします
Vendoringについて
Go 1.5から試験的に導入された機能で1.6でデフォルトの機能となっています。
何らかの理由で1.5を利用しなければいけない場合はGO15VENDOREXPERIMENT=1
と環境変数で設定する必要があります。
Goでは/vendor
ディレクトリを利用して依存性解決を行なっています。
Rubyで言うとこのBundlerやJSでいうところのYarn、PythonのPipを思い浮かべるとイメージしやすいかと思います。
パッケージ管理ツール
パッケージ管理ツールは思っていたより多く、記事記載時に500Starを超えているもので比較していきます。
表の「グローバル汚染なし」(?)はgo get
によってGOPATH配下のグローバルな場所を利用していない場合は となります。これ本当はなんていうんだろう?
ツール名 | Godep | Glide | Govendor | gom | manul |
---|---|---|---|---|---|
スター数(2016.12.14) | 4,106 | 3,360 | 1,333 | 1,189 | 575 |
開発開始 | 2013.04.28 | 2014.06.06 | 2015.04.12 | 2013.09.08 | 2015.09.27 |
グローバル汚染なし | |||||
バージョン管理 | Godeps/godeps.json | glide.yaml | vendor/vendor.json | Gomfile | git submodules |
キャッシュ | GOPATHからコピー | ||||
セマンティックバージョニング | |||||
グルーピング |
Godep
Goが出て間もない頃から出ているので機能的にほかのツールに劣りますが、Go1.5未満でも動作するようです。
Glide
一番多機能だと感じました。
セマンティックバージョニングが強力でマイナーバージョンの変更のみやパッチバージョンの変更のみアップデートすることができます。
他にも機能はたくさんあるようですが、複雑さはなく非常に使いやすいと思いました。
Govendor
十分な機能を携えています。
GOPATHからとリモートネットワークを通じての両方でパッケージのインストールをできるのが特徴的だなと思いました。
gom
唯一グルーピングができます。
Bundlerのtest,development,stagingのように使えて用途によってはかなりコンパクトなパッケージ管理ができると思います。
manul
gitのサブモジュールを利用するという全く別のアプローチを採用しています。
終わりに
あまりGoを触れていないので間違っていたら恐縮ですが、この記事を見てパッケージ管理を再考するきっかけになっていただければと思います。良いGoライフを!!