Skip to content

Evidence Base: go.work Footguns

20 verified public sources confirming the problem space. Organized by category.

Go Multi-Module Pain (from RFC-002, verified)

IDSourceTopic
E1golang/go#75900Replace directives break go install
E2golang/go#51967Multi-module monorepo lifecycle gaps
E3golang/go#44347Workspace proposal — original motivation
E4golang/go#45713Multi-module tagging complexity
E5golang/go#26664Replace + go install incompatibility
E6reddit r/golangCommunity frustration with multi-module
E7reddit r/golangReplace directives leak into shared code
E8AWS BlogOTel MultiMod — industry precedent
E9Hacker News"Extraordinarily brittle with Go" — community thread

go.work Specific Footguns (RFC-003, verified)

IDSourceTopicgover answer
E10golangci/golangci-lint#3798golangci-lint broken with go.workgover controls go.work generation; can use GOWORK=off for incompatible tools
E11(removed — source invalidated during verification. ID preserved for stable references)
E12golang/go#51959go work use -r . picks up test fixtures, creates unusable workspacegover filters vendor/, testdata/, hidden dirs
E13golang/go#57509cwd-based workspace detection — phantom go.work from parent dirgover always knows its own go.work; root = cwd
E14golang/go#50038go.work.sum auto-update + gopls masks go.sum errorsgover regenerates go.work from scratch; no stale state
E15golang/go#65847Toolchain directive auto-changes Go versiongover can enforce Go version alignment across modules
E16golang/go#60056Workspace vendoring incompatibilitygover does not depend on vendoring; replace directives work without vendor
E17golang/go#65130govulncheck broken in workspace modegover can iterate govulncheck per-module with GOWORK=off
E18golang/go#54611go.work path parsing error causes build failuregover generates correct relative paths from model
E19golang/go#51558GOWORK env silently affects buildgover controls GOWORK env explicitly when proxying commands

Toolchain Issues (supplementary)

IDSourceTopic
E20golang/go#70979GOTOOLCHAIN=local + tool blocks → parse error
E21golang/go#71864golang.org/x/* go directive forces toolchain directives

HN Thread Deep Analysis (E9)

The Hacker News thread (May 2021, 50+ comments) captures the community's unresolved frustration with Go multi-module projects. Key voices and gover's answers:

ParticipantClaimgover's answer
tsimionescu"This is trivial to do with any other module system I've used (Maven, Nuget, Konan, pip, cargo), but it is extraordinarily brittle with Go."RFC-002 §1 comparison table confirms: Go is the only major language without multi-module tooling. gover closes this gap.
q3k"Modules are not for monorepos and internal components" + "just don't do that"Monorepo ≠ multi-module project. Orthogonal concepts. OTel, HashiCorp, CockroachDB use multi-module. The pattern is established.
q3k"this requires tooling around your monorepo: proper CI, a fast build system"Correct — tooling is needed. But Bazel solves build orchestration. gover solves module governance. Orthogonal. Even Bazel users need go.mod management for Go Module Proxy publication.
Steltek"Go has the most awful module system I've ever used"Not awful — incomplete. gover completes it for multi-module projects.
tsimionescu"I've been trying to set up a Go monorepo... and it's been a mass of hacks"Exactly the problem gover solves: replace management, workspace sync, coordinated release — without hacks.

Thread conclusion: No participant proposed a solution. Resignation: "just use Bazel" or "just don't do multi-module." Five years later, Go still has not answered. gover is the answer.

Release Tooling Gaps (RFC-004, verified)

IDSource / EvidenceTopic
E22golang/go repository: src/go.mod (std), src/cmd/go.mod (cmd), misc/go.mod (misc)golang/go is multi-module (3 go.mod), one tag per release. Confirms one product = one version.
E23GoReleaser Pro --prepare/--publish — paid since v1.10 (July 2022)Prepare/publish separation is a paywall feature. gover has it by design (--write/--push).
E24semantic-release --dry-run — text-only output, no JSON, no exit codeNo machine-readable way to ask "will there be a release?" Confirmed across all forks.
E25@semantic-release/exec hack — node -e with child_process.execSync with git log inside JSON configCommunity workaround proves the gap exists. The "solution" is proof there is no solution.
E26ghset PR #20 — GoReleaser mode: keep-existing silently skips uploadsReal-world evidence of monolithic release tools failing when composed.
E27ghset PR #23 — release pipeline analysis leading to RFC-004 scope expansionTrigger for multimod → gover rename and scope expansion to all Go projects.
E28go-semantic-release v2 (313 stars) — no prepare/publish, no JSON dry-runGo-native reimplementation inherits same architectural limitations.
E29uplift --no-push (38 stars, dead) — independently discovered prepare/publish patternConvergent design confirms the pattern. Project died, pattern survived.
E303 rounds ecosystem research — zero tools for: publish-state creation, config portability, project metadata as JSON, archive+checksum as standalone primitiveComprehensive gap analysis across Go ecosystem.
E31go.work proposals in golang/go — none found for filtering, workspace-level tidy, or multi-module releaseGo team is not planning to close these gaps.

Apache 2.0 · Built in public · Contributions welcome