golang

`dep ensure` の代替 `dep-dl` を作ってみた。

More than 1 year has passed since last update.

最近、golangでパッケージのバージョン固定の用途に使うパッケージマネージャーというと dep コマンドかと思います。

ただ、このコマンドなかなかクセがあって、初回の実行時間が長くて何をやっているのかわかりづらいなど、少々わかりづらい子であったりします。

一応、 -v オプションを付けてあげると、何をしているのか若干見れますが、それでも終わるまで意外とかかります。

原因は、主にパッケージの依存解決で、ものすごくネットワーク負荷が高いことなようです。

(詳しくは#289あたりを読むとよいかと思います。)


経緯とか

昨日あたりに愚痴っていたのですが、ゴールデンウィークの中日に出勤とかしてると、仕事の進捗が割と順調で若干手が空いたので、雑に作ってみました。

dep-dlというコマンドです。

プロジェクトディレクトリで dep-dl コマンドを走らせると vendor/Gopkg.lock に書いてあるパッケージを全部ダウンロードしてくれます。


実装の裏とか

雑に書いたメモにほしかった機能は書いてあって、gopkg.inやgo.uber.orgと名付けれているパッケージもちゃんと取得できるようにしてあります。

本当は、何度か脳内で挑戦していて、今回は go-importの仕様をやっと理解できたので、それなりに実用にたるものを作れました。

dep ensure にはない機能として、GitHubからはtarballとしてダウンロードするので有利かと思います。


性能

そこそこパッケージ数のある(100に満たない程度)プロジェクトで試してみたんですが、dep ensure でキャッシュなしだと2分未満程度かかるパッケージの取得が20秒程度で取得がてきました。

ただ、キャッシュありの dep ensure で比較してみたところ、2秒かからない程度で終わったので、時間的に



キャッシュなし`dep ensure` >>> `dep-dl` >>>>>> キャッシュあり`dep ensure`



となりました。

あんまり真面目に計測したわけではないので、測定が得意な人に試してほしいです。


用途

性能を見るとわかるんですが、パッケージをしょっちゅう入れ替えるような開発にはそれほど向いていません。

あえて、開発で使うとするとパッケージ変更ができない縛りができるので、ちょっとした変更を別の環境で行うならよいかと思います。


終わりに

ひとまず実装できた程度なんで、余裕がある時に、会社のCIで dep ensure 使ってるところを目標にがんばろうかと思います。