🧐

velde: dlvのバージョン違いを吸収するツール

2024/02/29に公開

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

https://github.com/youta-t/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 versiongo install をしようとします。go sdk を切り替えたい場合は、パスか

つかってみる

あとは、普通にデバッグするだけです。

適当な dlv がないことを velde が検出すると、勝手に dlv をインストールして勝手にタスクを引き継ぎます。サラッとデバッグセッションが開始されるはずです。

まとめ

dlv をプロキシするツールつくってみたよ、というお話でした。
まだザッと書き下しただけなのでテストもゆるゆるですが... どうでしょう? 需要あるのかなこれ。

ところで、どうやら gopls にも似たような問題があるようなので、こっちも解決しないといかんのかな、と思いつつあります。

脚注
  1. 実際私も、go1.18 -> go1.22 へのアップグレード、というタスクの中でこれを経験しました。 ↩︎

  2. VSCodeは、"Go>Tools Management: Auto Update" をオンにしておくと、エディタをリロードするだけで自動的に dlv をアップグレードはしてくれるみたいです。が、ダウングレードはサポートされていないようですね。 ↩︎

  3. あるいは、適当な PATH が通っている先に dlv としての symlink をつくってもいいです。この場合は、IDE に dlv のパスを明示的に設定してやる必要はあるでしょう。 ↩︎

  4. VSCode の場合は、 "Go: Alternate Tools" で本物の dlv の代わりに velde を向いた symlink の dlv を指定すればよいです。 ↩︎

Discussion