goreleaser/goreleaser · error
no published Node.js release satisfies %q
Error message
no published Node.js release satisfies %q
What it means
If the engines.node range parses successfully but no release in the embedded nodedist index satisfies it, resolveVersionString returns this error naming the raw range. Only published Node.js releases can be selected.
Source
Thrown at internal/builders/node/download.go:94
constraint, err := semver.NewConstraint(raw)
if err != nil {
return "", fmt.Errorf("invalid semver constraint: %w", err)
}
var found *semver.Version
for verStr := range nodedist.Releases() {
v, err := semver.NewVersion(verStr)
if err != nil {
continue
}
if constraint.Check(v) {
if found == nil || v.GreaterThan(found) {
found = v
}
}
}
if found == nil {
return "", fmt.Errorf("no published Node.js release satisfies %q", raw)
}
if err := validateNodeSEAVersion(found); err != nil {
return "", err
}
return "v" + found.String(), nil
}
func validateNodeSEAVersion(v *semver.Version) error {
minV := semver.MustParse(minNodeSEAVersion)
if v.LessThan(minV) {
return fmt.Errorf("node.js SEA requires Node.js >= v%s, got v%s", minV, v)
}
return nil
}
func checkHostNodeVersion(ctx context.Context, tool string, env []string) error {
cmd := exec.CommandContext(ctx, tool, "--version") //nolint:gosec
cmd.Env = envView on GitHub (pinned to f5edd73956)
Solutions
- Widen engines.node to a range matching a published release, e.g. '>=20' instead of '>=99'
- Pin engines.node to a concrete existing version like '22.11.0'
- Upgrade GoReleaser to get a newer embedded release index
Example fix
// before (package.json)
"engines": { "node": ">=99" }
// after
"engines": { "node": ">=20" } Defensive patterns
Strategy: validation
Validate before calling
// confirm at least one known release satisfies the range before building
constraint, _ := semver.NewConstraint(enginesNode)
var any bool
for rel := range nodedist.Releases() {
if v, err := semver.NewVersion(rel); err == nil && constraint.Check(v) {
any = true
}
}
if !any {
return fmt.Errorf("no node release satisfies %q; widen the range", enginesNode)
} Try / catch
if err := run(); err != nil {
if strings.Contains(err.Error(), "no published Node.js release satisfies") {
log.Fatalf("widen engines.node range %v", err)
}
return err
} Prevention
- Pin engines.node to an existing released version or a wide range like >=20
- Upgrade goreleaser so the embedded release index includes recent Node versions
- Avoid ranges referencing unreleased future majors
When it happens
Trigger: engines.node specifies a range that matches no released Node version, e.g. '>=99', a version newer than any published release, or a range only matching pre-release versions not in the index.
Common situations: Pinning engines.node to a not-yet-released Node major, using a range with an unusual pre-release qualifier, or working with an outdated GoReleaser that predates the newest Node releases (embedded index is stale).
Related errors
- node: resolve node version: %w
- node: resolve package.json engines.node value %q: %w
- invalid semver constraint: %w
- node: template tool: %w
- node: read package.json: %w
AI-assisted analysis of goreleaser/goreleaser@f5edd73956 (2026-09-05).
Data as JSON: /api/errors/8b66579cac6e0819.
Report an issue: GitHub.