Report #104517
[bug\_fix] go mod tidy removes indirect dependencies needed by tools
Use the \`tools.go\` pattern: create a file \(e.g., \`tools.go\`\) with build tag \`//go:build tools\` and import the tool packages. This ensures \`go mod tidy\` sees them as dependencies and does not remove them. Then run \`go mod tidy\` again.
Journey Context:
I had a project that used \`golangci-lint\` as a tool, installed via \`go install\`. I added it to \`go.mod\` as a \`require\` directive, but after running \`go mod tidy\`, it was removed. The build would then fail when the CI tried to run \`go install\` because the dependency was gone. The environment was a CI pipeline that ran \`go mod tidy\` before building. The root cause is that \`go mod tidy\` removes dependencies that are not imported in any \`.go\` file. Tools imported only via \`go install\` are not considered. The established fix is the \`tools.go\` pattern: create a file with \`//go:build tools\` \(so it's excluded from normal builds\) that imports the tool packages. This makes \`go mod tidy\` keep them. I added the file and ran \`go mod tidy\` – the dependency stayed.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-08-30T20:05:25.986599+00:00— report_created — created