こんにちは。KOUKIです。
とあるWeb系企業でエンジニアをやってます。
皆さんは、プログラミングをするときにデバッグを行うでしょうか?
(デバッグをしないエンジニアに未だかつて出会ったことはありませんが,,,)
デバッグの一つの方法として、「プログラムの中にログを仕込む」が王道の一つだと思います。
しかし、「他の人が開発したパッケージ内でデバッグしたい」場合は、どのようにログを仕込めばいいのか想像できるでしょうか。
その答えを握るのが「go mod vendor」という機能です。
この機能については、実際に使いながら解説していきます。
<目次>
事前準備
下記のコマンドを実行してください。
1 2 3 4 |
mkdir test-debug cd test-debug/ touch main.go go mod init test-debug |
パッケージ管理ツール(Go Mod)
「go mod init」は重要なので、必ず実行しましょう。
これはGoのパッケージ管理ツールです。上記のコマンドを実行するとローカルに「go.mod」ファイルが作成されます。
中身は以下です。
1 2 3 |
module test-debug go 1.17 |
例えば、golangのWebフレームワークであるFiberをインストールしてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ go get -u github.com/gofiber/fiber/v2 go: downloading github.com/gofiber/fiber/v2 v2.27.0 go: downloading github.com/valyala/fasthttp v1.33.0 go: downloading golang.org/x/sys v0.0.0-20220111092808-5a964db01320 go: downloading github.com/andybalholm/brotli v1.0.4 go: downloading github.com/klauspost/compress v1.14.1 go: downloading golang.org/x/sys v0.0.0-20220209214540-3681064d5158 go: downloading github.com/klauspost/compress v1.14.3 go get: added github.com/andybalholm/brotli v1.0.4 go get: added github.com/gofiber/fiber/v2 v2.27.0 go get: added github.com/klauspost/compress v1.14.3 go get: added github.com/valyala/bytebufferpool v1.0.0 go get: added github.com/valyala/fasthttp v1.33.0 go get: added github.com/valyala/tcplisten v1.0.0 go get: added golang.org/x/sys v0.0.0-20220111092808-5a964db01320 |
何やら色々とダウンロードされましたね。
go.modをチェックしてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
module test-debug go 1.17 require ( github.com/andybalholm/brotli v1.0.4 // indirect github.com/gofiber/fiber/v2 v2.27.0 // indirect github.com/klauspost/compress v1.14.3 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.33.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect golang.org/x/sys v0.0.0-20220111092808-5a964db01320 // indirect ) |
依存パッケージなどが列挙されたことがわかりますね。
Webアプリを実装
main.goに下記のプログラムを実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package main import ( "log" "github.com/gofiber/fiber/v2" ) func main() { app := fiber.New() // GET /api/register app.Get("/", func(c *fiber.Ctx) error { msg := "Hello World" return c.SendString(msg) }) log.Fatal(app.Listen(":8080")) } |
下記のコマンドで、Webアプリを起動しましょう。
1 2 3 4 5 6 7 8 9 10 11 |
$ go run main.go ┌───────────────────────────────────────────────────┐ │ Fiber v2.27.0 │ │ http://127.0.0.1:8080 │ │ (bound on host 0.0.0.0 and port 8080) │ │ │ │ Handlers ............. 2 Processes ........... 1 │ │ Prefork ....... Disabled PID .............. 2862 │ └───────────────────────────────────────────────────┘ |
ブラウザから「http://localhost:8080/」にアクセスします。

デバッグ方法
事前準備が長くなりましたが、ようやく本題です。
go.modファイルが存在するディレクトリ上で、「go mod vendor」を実行してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// 実行前 $ tree . ├── go.mod ├── go.sum └── main.go // vendorコマンド実行う $ go mod vendor $ tree -L 3 . ├── go.mod ├── go.sum ├── main.go └── vendor ├── github.com │ ├── andybalholm │ ├── gofiber │ ├── klauspost │ └── valyala ├── golang.org │ └── x └── modules.txt |
「vendor」フォルダ作成され、ここに依存パッケージが全て格納されたことがわかりますね。
今後、Goのプログラムはこのvendorからプログラムを読み込みます。
つまり、ここにログを仕込めばいいのです。
試してみましょう。
例えば、以下のコードのNewの部分にカーソルを当てて「F12」キーを押下します。
Visual Studioの場合は、これでパッケージ内の該当のコードに飛ぶことが可能です。
1 2 3 |
package main // Newにカーソルを当ててF12 app := fiber.New() |
1 2 3 4 5 6 |
package fiber // Newに飛ぶ func New(config ...Config) *App { // Create a new app ... } |
飛び先は、「vendor」フォルダ配下の「app.go」ファイルであることがわかります。

ログを仕込んでみましょう。
1 2 3 4 5 6 |
// ログを仕込む func New(config ...Config) *App { log.Println("----------------------New-------------------------") // Create a new app ... } |
「log.Println(“———————-New————————-“)」の感じで、ログを仕込んでみました。
Webアプリを立ち上げ直します。
1 2 3 4 5 6 7 8 9 10 11 |
$ go run main.go 2022/02/18 05:11:57 ----------------------New------------------------- ┌───────────────────────────────────────────────────┐ │ Fiber v2.27.0 │ │ http://127.0.0.1:8080 │ │ (bound on host 0.0.0.0 and port 8080) │ │ │ │ Handlers ............. 2 Processes ........... 1 │ │ Prefork ....... Disabled PID .............. 3435 │ └───────────────────────────────────────────────────┘ |
コマンド実行直後にログが出てきましたね!
グレートですよ。こいつは!!!!
Goのコードは、「vendor」フォルダを優先的に読み込むのでログを仕込めるわけですね。
もちろん「vendor」フォルダを消せば、ログも消えます。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ rm -rf vendor/ $ go run main.go ┌───────────────────────────────────────────────────┐ │ Fiber v2.27.0 │ │ http://127.0.0.1:8080 │ │ (bound on host 0.0.0.0 and port 8080) │ │ │ │ Handlers ............. 2 Processes ........... 1 │ │ Prefork ....... Disabled PID .............. 3498 │ └───────────────────────────────────────────────────┘ |
まとめ
デバッグを行う上で、ログを仕込むことはとても有効な手段の一つです。
Golangでは、本記事で紹介した方法を行えば簡単にデバッグすることができますね^^
vendorを実行するためには「go mod init」が必要なので、それをお忘れなく。
それでは、また!
コメントを残す
コメントを投稿するにはログインしてください。