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
- Provide at least name and url for every [[deployment.targets]] entry.
- Remove any empty/placeholder target entries from the config.
- 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
- Give every [[deployment.targets]] entry a name and url.
- Remove placeholder target stubs.
- Validate config with `hugo config` before deploying.
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
- empty deployment matcher
- no deployment targets found
- aborted
- --appendPort=false not supported when in multihost mode
- cache dir contains unresolved placeholders
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)