puppetlabs/puppet · error · ArgumentError
Dependency conflict for %{module_name}: Dependency %{name} w
Error message
Dependency conflict for %{module_name}: Dependency %{name} was given conflicting version requirements %{version_requirement} and %{dup_version}. Verify that there are no duplicates in the metadata.json. What it means
Puppet::ModuleTool::Metadata#add_dependency raises ArgumentError when a dependency with the same full_module_name is already registered with a DIFFERENT version_requirement — i.e. metadata.json (or a merge into it) declares the same dependency twice with conflicting ranges. Identical duplicates are tolerated; conflicting ones are rejected to avoid an ambiguous requirement. merge_dependencies triggers this while parsing a metadata.json file.
Source
Thrown at lib/puppet/module_tool/metadata.rb:72
process_name(data) if data['name']
process_version(data) if data['version']
process_source(data) if data['source']
process_data_provider(data) if data['data_provider']
merge_dependencies(data) if data['dependencies']
@data.merge!(data)
self
end
# Validates the name and version_requirement for a dependency, then creates
# the Dependency and adds it.
# Returns the Dependency that was added.
def add_dependency(name, version_requirement = nil, repository = nil)
validate_name(name)
validate_version_range(version_requirement) if version_requirement
dup = @data['dependencies'].find { |d| d.full_module_name == name && d.version_requirement != version_requirement }
raise ArgumentError, _("Dependency conflict for %{module_name}: Dependency %{name} was given conflicting version requirements %{version_requirement} and %{dup_version}. Verify that there are no duplicates in the metadata.json.") % { module_name: full_module_name, name: name, version_requirement: version_requirement, dup_version: dup.version_requirement } if dup
dep = Dependency.new(name, version_requirement, repository)
@data['dependencies'].add(dep)
dep
end
# Provides an accessor for the now defunct 'description' property. This
# addresses a regression in Puppet 3.6.x where previously valid templates
# referring to the 'description' property were broken.
# @deprecated
def description
@data['description']
end
def dependencies
@data['dependencies'].to_a
endView on GitHub (pinned to e227c27540)
Solutions
- Open metadata.json, grep for the duplicated name, and keep a single entry whose range covers what you need
- Merge the two ranges into one constraint, e.g. '>= 4.0.0 < 7.0.0', instead of two entries
- If generating metadata programmatically, check @data['dependencies'] for an existing entry and update it rather than adding again
- Validate with `ruby -rjson -e "puts JSON.parse(File.read('metadata.json'))['dependencies'].map { |d| d['name'] }.tally.select { |_,c| c>1 }"` to find dupes
Example fix
// before - metadata.json
"dependencies": [
{ "name": "puppetlabs/stdlib", "version_requirement": ">= 4.0.0 < 6.0.0" },
{ "name": "puppetlabs/stdlib", "version_requirement": ">= 6.0.0" }
]
// after
"dependencies": [
{ "name": "puppetlabs/stdlib", "version_requirement": ">= 4.0.0 < 8.0.0" }
] Defensive patterns
Strategy: validation
Validate before calling
deps = JSON.parse(File.read('metadata.json'))['dependencies']
counts = deps.map { |d| d['name'] }.group_by(&:itself).transform_values(&:length)
dupes = counts.select { |_, c| c > 1 }
abort "duplicate dependencies: #{dupes.keys.join(', ')}" unless dupes.empty? Try / catch
begin
metadata.add_dependency(dep_name, dep_range)
rescue ArgumentError => e
raise if e.message !~ /conflicting version requirements/
# merge ranges instead of duplicating the entry
existing = metadata.dependencies.find { |d| d.full_module_name == dep_name }
merged = merge_ranges(existing.version_requirement, dep_range)
metadata.update('dependencies' => [{ 'name' => dep_name, 'version_requirement' => merged }])
end Prevention
- Dedupe the dependencies array whenever you generate or hand-edit metadata.json
- Keep one entry per dependency and encode all constraints in a single range
- Run `puppet module build` as a smoke test after metadata edits — it parses and validates the file
When it happens
Trigger: A metadata.json whose dependencies array lists puppetlabs-stdlib twice — once as '>= 4.0.0 < 6.0.0' and once as '>= 6.0.0' — parsed by Puppet::ModuleTool::Metadata (merge_dependencies → add_dependency); or programmatically calling metadata.add_dependency twice with different ranges.
Common situations: Hand-edited metadata.json where a dependency was appended instead of updated; ERB/templates concatenating dependency lists; merging module metadata from two sources; YAML-driven generators emitting one entry per template.
Related errors
- Invalid 'name' field in metadata.json: %{err}
- Invalid 'version' field in metadata.json: %{err}
- field 'data_provider' contains non-alphanumeric characters
- field 'data_provider' must begin with a letter
- field 'data_provider' must be a string
AI-assisted analysis of puppetlabs/puppet@e227c27540 (2026-08-21).
Data as JSON: /api/errors/f043c41789f9a7e2.
Report an issue: GitHub.