開発環境の整備のためのDelve設定
概要
EchoのAPI開発環境の整備のためにDelveを導入する。
また、airが導入済みの環境なので共存を目指す。
Delveとは
Goのコードデバックできるようにするライブラリとなっている。
イメージ的には、Railsのbyebugに近いものではある。
IDEと組み合わせないとコンソール上でブレークポイントの設置などをしなくてはならないです。
Delveの導入
利用しているDockerfileに以下のコマンドを追加する
RUN go install github.com/go-delve/delve/cmd/dlv@latest
その後、docker compose build
を行いコンテナを再作成する。
コンテナ起動後に
dlv version
(実行結果)
Delve Debugger
Version: 1.22.0
Build: $Id: 61ecdbbe1b574f0dd7d7bad8b6a5d564cce981e9 $
を実行してVersion情報が取得できれば導入は完了です。
Delveの使い方
基本的な使い方は、起動コマンドを
dlv debug main.go
(実行結果)
(dlv)
で起動するとデバックモードで起動します。
起動に成功するとdlv入った状態でコマンド入力できる状態になります。
いくつか利用できるコマンドを紹介します。
funcs 関数確認
(dlv) funcs main\..*
関数確認コマンドになります。
ワイルドカードも利用でき、該当を一覧で出力してくれます。
list ソースコード確認
(dlv) list main.main
該当関数のソースコードが確認できます。
(dlv) list main.main:3
該当関数の指定行のコードを確認できます。
break ブレイクポイントの設定
(dlv) break main.main
該当関数をブレイクポイントに設定します。
(dlv) break main.main:3
該当関数の指定行のコードをブレイクポイントに設定します。
breakpoints ブレイクポイントの確認
(dlv) breakpoints
現在設定しているブレイクポイントの確認ができます。
処理を進める
continue
次のブレイクポイントまで進める。
next
1行処理を進める(ステップオーバー)。
step
1行処理を進める。
stepout
現在の関数から抜ける。
といったコマンドが用意されている。
他にも変数の上書きなども用意されているので使いこなせれば開発効率が上がってくることが間違いないが、コンソールを使わなければいけないことが難点・・・・・
しかし、CLI方式だけでなく、外部からデバッカーを接続するリモートデバック機能があります。
この機能を使うほうが利用したツールに合わせた対応ができるようになるので一般的かもしれません。リモートデバックは起動時のコマンド指定が必要になるのですでに導入しているairとの共存しながらできるようにします。
airとの共存
追加のインストール対応はなく、airの設定している.air.toml
ファイルを編集します。
cmd = "go build -o ./tmp/main ."
bin = "tmp/main"
full_bin = "APP_ENV=dev APP_USER=air dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec --continue ./tmp/main"
一番大事なポイントはfull_bin
の内容です。dlvコマンド時に--linstenなどのパラメータを追加することでリモートデバックが可能になります。
今回の設定ではリモートデバックとして2345ポートを使用する設定になっています。
Docker環境なので、docker-compose.ymlのポートでも2345ポートを利用できるように追記することを忘れないようしましょう。
Goland設定編
私はGolandを普段使っていますが、IDEの設定方法は
- 右上から
実行構成の編集
を選択 - +アイコンをクリックして、
Go リモート
を選択 - 以下のキャプチャにホスト、ポート、切断時の設定します。
で設定完了です。
デバックで止めたいときなどにデバック実行しておけば、IDE上で設定したブレイクポイントで処理が止まるようになります。
処理の進め方などもほかのデバック処理時の扱いと同じになります。
VSCode設定編
VSCodeでは、実行とデバック
のメニューから設定追加をし、
.vscode/launch.jsonを用意します。
ファイルの内容は
{
"version": "0.2.0",
"configurations": [
{
"name": "Remote",
"type": "go",
"request": "attach",
"mode": "remote",
"remotePath": "",
"port": 2345,
"host": "localhost",
"cwd": "${workspaceRoot}",
"env": {},
"args": []
}
]
}
を記載して保存。
デバックで止めたいときにこちらを起動すれば、VSCode上でのブレイクポイントが有効になります。
最後に
今回は開発環境を用意するためにDelveを導入して、デバックしやすい環境を用意しました。
調べると他のライブラリでもやれるようですが、Delveに乗り換えたみたいな記事も見られたので主流な方法なように思えました。
デメリットとしては、本番環境に適応するときにはDelveを入れたくないのでDockerfileは使い分ける必要があることくらいですかね。
個人的には細かく状態を確認していきたい派なのでテストコードを細かい粒度で作成するだけでなく、
実態が確認できるDelveは使い道がたくさんあるライブラリとなっています。
Discussion