gohugoio/hugo · error

empty deployment target

Error message

empty deployment target

What it means

During deploy config decoding, each entry in deployment.targets is compared to the zero-value Target{}. An entry that decoded to all-empty fields (no name, no url, etc.) is rejected as an empty target.

Solutions

  1. Provide at least name and url for every [[deployment.targets]] entry.
  2. Remove any empty/placeholder target entries from the config.
  3. Validate config indentation so targets decode with their fields.

Example fix

// before
[[deployment.targets]]
# (no fields)
// after
[[deployment.targets]]
name = "mybucket"
url = "s3://my-bucket?region=us-east-1"
Defensive patterns

Strategy: validation

Validate before calling

// Reject empty target entries before deploying
for _, t := range targets {
    if t == (Target{}) {
        return errors.New("empty deployment target found; populate name and url")
    }
}

Prevention

When it happens

Trigger: A `[[deployment.targets]]` table with no keys, or a malformed/placeholder entry that fails to populate any field.

Common situations: Leftover placeholder target in config; a YAML/TOML indentation error that yields an empty map; copy-paste of a target stub without filling it in.

Related errors


AI-assisted analysis of gohugoio/hugo@52c9bd7908 (2026-08-09). Data as JSON: /api/errors/97d20684c24948b1. Report an issue: GitHub.

Appendix: source

Thrown at deploy/deployconfig/deployConfig.go:154

// DecodeConfig creates a config from a given Hugo configuration.
func DecodeConfig(cfg config.Provider) (DeployConfig, error) {
	dcfg := DefaultConfig

	if !cfg.IsSet(DeploymentConfigKey) {
		return dcfg, nil
	}
	if err := mapstructure.WeakDecode(cfg.GetStringMap(DeploymentConfigKey), &dcfg); err != nil {
		return dcfg, err
	}

	if dcfg.Workers <= 0 {
		dcfg.Workers = 10
	}

	for _, tgt := range dcfg.Targets {
		if *tgt == (Target{}) {
			return dcfg, errors.New("empty deployment target")
		}
		if err := tgt.ParseIncludeExclude(); err != nil {
			return dcfg, err
		}
	}
	var err error
	for _, m := range dcfg.Matchers {
		if *m == (Matcher{}) {
			return dcfg, errors.New("empty deployment matcher")
		}
		m.Re, err = regexp.Compile(m.Pattern)
		if err != nil {
			return dcfg, fmt.Errorf("invalid deployment.matchers.pattern: %v", err)
		}
	}
	for _, o := range dcfg.Order {
		re, err := regexp.Compile(o)
		if err != nil {

View on GitHub (pinned to 52c9bd7908)