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
    end

View on GitHub (pinned to e227c27540)

Solutions

  1. Open metadata.json, grep for the duplicated name, and keep a single entry whose range covers what you need
  2. Merge the two ranges into one constraint, e.g. '>= 4.0.0 < 7.0.0', instead of two entries
  3. If generating metadata programmatically, check @data['dependencies'] for an existing entry and update it rather than adding again
  4. 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

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


AI-assisted analysis of puppetlabs/puppet@e227c27540 (2026-08-21). Data as JSON: /api/errors/f043c41789f9a7e2. Report an issue: GitHub.