{"record":{"id":"2af7a6af02cb24a6","repo":"hashicorp/packer","slug":"unsupported-dependency-type-q-locals-can-only-de","errorCode":null,"errorMessage":"unsupported dependency type %q; locals can only depend on local, var or data.","messagePattern":"unsupported dependency type %q; locals can only depend on local, var or data\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"hcl2template/types.refstring.go","lineNumber":143,"sourceCode":"\tcase \"data\", \"local\":\n\t\tds.Dependencies = append(ds.Dependencies, rs)\n\t// NOOP: vars are always evaluated beforehand for datasources\n\tcase \"var\":\n\tdefault:\n\t\treturn fmt.Errorf(\"unsupported dependency type %q; datasources can only depend on local, var or data.\", rs.MType)\n\t}\n\n\treturn nil\n}\n\nfunc (loc *LocalBlock) RegisterDependency(rs refString) error {\n\tswitch rs.MType {\n\tcase \"data\", \"local\":\n\t\tloc.dependencies = append(loc.dependencies, rs)\n\t// NOOP: vars are always evaluated beforehand for locals\n\tcase \"var\":\n\tdefault:\n\t\treturn fmt.Errorf(\"unsupported dependency type %q; locals can only depend on local, var or data.\", rs.MType)\n\t}\n\n\treturn nil\n}\n","sourceCodeStart":125,"sourceCodeEnd":148,"githubUrl":"https://github.com/hashicorp/packer/blob/eb36e3c3e48a036f3e8cc94087636ee72e1303c9/hcl2template/types.refstring.go#L125-L148","documentation":"RegisterDependency records an upstream resource (data source, local, or var) as a dependency of a local value so locals can be evaluated in the correct order. Packer throws this error when a dependency of a type other than local, var, or data is registered against a local — the local evaluation graph cannot resolve any other reference root type.","triggerScenarios":"Calling RegisterDependency with a refstring whose MType is not \"data\", \"local\", or \"var\" (e.g. a mis-attributed ref that resolves to a builder or unknown root), during local dependency collection while preparing an HCL2 template.","commonSituations":"A template references an undefined or mistyped block inside a local expression (e.g. typo'd root like localz.foo or builder.name), or a refactor/parsing bug produces a traversal root the local dependency walker doesn't recognize.","solutions":["Find the local expression containing the bad reference and fix the root name to an existing local, var, or data source block","Check for typos in block labels inside locals (e.g. `${localz.x}` instead of `${local.x}`)","If a custom plugin or forked code registers dependencies, ensure it only passes refstrings with MType data, local, or var","Run `packer init` and validate the template with `packer validate` after fixing the reference"],"exampleFix":"// before (template with bad root)\nlocals { name = \"${builder.type}-image\" }\n// after\nlocals { name = \"${local.base_name}-image\" }","handlingStrategy":"validation","validationCode":"var depRoots = map[string]bool{\"local\": true, \"var\": true, \"data\": true}\nfunc validLocalDep(mtype string) bool { return depRoots[mtype] }\n// before registering:\n// if !validLocalDep(rs.MType) { return fmt.Errorf(\"cannot register dependency %q for locals\", rs.MType) }","typeGuard":"func isSupportedLocalDep(mtype string) bool {\n\tswitch mtype {\n\tcase \"local\", \"var\", \"data\":\n\t\treturn true\n\t}\n\treturn false\n}","tryCatchPattern":null,"preventionTips":["Reference only local, var, and data blocks inside locals expressions","Run `packer validate` on templates before builds to catch bad roots early","Watch for typos in block type names (local vs localz)","Keep local expressions simple and avoid copy-paste from other tools' syntax"],"tags":["hcl2","locals","dependency-graph","packer"],"backgroundTag":"unsupported-dependency-type","analyzedSha":"eb36e3c3e48a036f3e8cc94087636ee72e1303c9","analyzedAt":"2026-09-05T13:20:43.127Z","contentChangedAt":"2026-09-05T13:20:43.127Z","schemaVersion":2},"datasetVersion":"2026-09-12T17:17:11.597Z"}