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 = env

View on GitHub (pinned to f5edd73956)

Solutions

  1. Widen engines.node to a range matching a published release, e.g. '>=20' instead of '>=99'
  2. Pin engines.node to a concrete existing version like '22.11.0'
  3. 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

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


AI-assisted analysis of goreleaser/goreleaser@f5edd73956 (2026-09-05). Data as JSON: /api/errors/8b66579cac6e0819. Report an issue: GitHub.