velde: dlvのバージョン違いを吸収するツール
youta-t です!
今日は最近ちょろっと書いてきた新作の紹介をするよ。
モチベーション
ある日は go1.21 、ある日は go1.18... なんて開発の仕方をしてるとしましょう[1]。
で、ある時 go1.18 でデバッグを始めると、こんなことを言われるわけです。
dlv 「go が古すぎて、サポートしてないよ」
そうでした。最近 go1.21 系向けに dlv を最新版にアップグレードしたんでした。
じゃあ、今はとりあえずこないだまでつかってたバージョンにダウングレードして...
$ go install github.com/go-delve/delve/cmd/dlv@v1.20.2
よし、デバッグできた。じゃあ次は go1.21 だな。エディタを切り替えて[2]...
えっと、アップグレードしなきゃね。 ...いや、ちょっとこれはめんどくさすぎませんか?
そこで velde
velde はこうした問題を解決するために作られました。
velde は、「1. 使っているgo をサポートしている最新の dlv を自動的にインストール」して、「2. その dlv をサブプロセスとして起動 」します。
もちろん、すでにちょうどいい dlv がインストール済みなら、ステップ 1. はスキップされます。
dlv を直接呼び出す代わりに velde を噛ませることで、dlv のバージョンについて悩む必要がなくなるのです。
velde のインストール
インストールの方法はちょっとクセがあります。
velde は "dlv" という名前で起動されたときだけ dlv をプロキシしようとするので、そういう事ができる状況を整えてやる必要があるのです。
まず、 velde をインストールします
go install github.com/yotua-t/velde
そのあと、 dlv という名前で、velde を向いた symlink を作ります。
ln -s ./velde ~/go/bin/dlv
これに先立って、適宜 dlv をアンインストールしてください[3]。
以後、「velde を向いた symlink dlv」を dlv だと思って扱ってください[4]。
velde の環境変数
velde は環境変数 VELDE_PATH
を参照します。
この値は、「delve をインストールする先」として解釈されます。デフォルトは ~/.velde
です。
dlv と go のバージョンについて
velde は go のバージョンを確認したり、 dlv を go install
したりするために go をサブプロセスとして呼び出しています。
このとき、まさに go
という名前のコマンドに対して go version
や go install
をしようとします。go sdk を切り替えたい場合は、パスか
つかってみる
あとは、普通にデバッグするだけです。
適当な dlv がないことを velde が検出すると、勝手に dlv をインストールして勝手にタスクを引き継ぎます。サラッとデバッグセッションが開始されるはずです。
まとめ
dlv をプロキシするツールつくってみたよ、というお話でした。
まだザッと書き下しただけなのでテストもゆるゆるですが... どうでしょう? 需要あるのかなこれ。
ところで、どうやら gopls にも似たような問題があるようなので、こっちも解決しないといかんのかな、と思いつつあります。
-
実際私も、go1.18 -> go1.22 へのアップグレード、というタスクの中でこれを経験しました。 ↩︎
-
VSCodeは、"Go>Tools Management: Auto Update" をオンにしておくと、エディタをリロードするだけで自動的に dlv をアップグレードはしてくれるみたいです。が、ダウングレードはサポートされていないようですね。 ↩︎
-
あるいは、適当な PATH が通っている先に dlv としての symlink をつくってもいいです。この場合は、IDE に dlv のパスを明示的に設定してやる必要はあるでしょう。 ↩︎
-
VSCode の場合は、 "Go: Alternate Tools" で本物の dlv の代わりに velde を向いた symlink の dlv を指定すればよいです。 ↩︎
Discussion