{"record":{"id":"7d468065fbf8abee","repo":"ruby/ruby","slug":"unresolved-dependency-found-during-sorting-dep","errorCode":null,"errorMessage":"Unresolved dependency found during sorting - #{dep} (requested by #{node.spec.full_name})","messagePattern":"Unresolved dependency found during sorting - #(.+?) \\(requested by #(.+?)\\)","errorType":"exception","errorClass":"Gem::DependencyError","httpStatus":null,"severity":"error","filePath":"lib/rubygems/request_set.rb","lineNumber":513,"sourceCode":"    end\n  end\n\n  def tsort_each_node(&block) # :nodoc:\n    @requests.each(&block)\n  end\n\n  def tsort_each_child(node) # :nodoc:\n    node.spec.dependencies.each do |dep|\n      next if dep.type == :development && !@development\n\n      match = @requests.find do |r|\n        dep.match?(r.spec.name, r.spec.version, r.spec.is_a?(Gem::Resolver::InstalledSpecification) || @prerelease)\n      end\n\n      unless match\n        next if dep.type == :development && @development_shallow\n        next if @soft_missing\n        raise Gem::DependencyError,\n              \"Unresolved dependency found during sorting - #{dep} (requested by #{node.spec.full_name})\"\n      end\n\n      yield match\n    end\n  end\nend\n\nrequire_relative \"request_set/gem_dependency_api\"\nrequire_relative \"request_set/lockfile\"\n","sourceCodeStart":495,"sourceCodeEnd":524,"githubUrl":"https://github.com/ruby/ruby/blob/0e5b888e1c355f3f728f2659f085820937dada48/lib/rubygems/request_set.rb#L495-L524","documentation":"During Gem::RequestSet's topological sort (tsort_each_child), every runtime dependency of each already-resolved spec is matched against the resolved requests via dep.match?. If no resolved spec satisfies a gem's dependency, Gem::DependencyError is raised - the resolved set is internally inconsistent. It is suppressed for shallow development dependencies and whenever soft_missing is enabled (e.g. `gem install --force`).","triggerScenarios":"Resolving a set where a resolved gem's transitive dependency is absent from @requests: vendored/path/git gems whose dependencies are not available from any set in the composition; enabling development deps (`--development`) where a dev dependency is uninstallable; version constraints that excluded a needed transitive version from the requests.","commonSituations":"`gem install -g` with a gems.rb mixing path:/git: gems whose dependencies are not published; stale installed-spec sets (IndexSet of installed gems) missing one transitive gem; lockfile-style flows where one dependency was removed from the set manually; partial vendor trees.","solutions":["Install the missing transitive gem first (its name/version appear in the message: 'Unresolved dependency found during sorting - <dep>') so the set can satisfy it","Loosen version pins on the gem listed as 'requested by' so resolution can include the needed dependency version","If missing deps are expected/acceptable, run with soft missing enabled: `gem install --force` (DependencyInstaller sets request_set.soft_missing = @force)","For path:/git: gems, ensure their runtime dependencies are either committed to the tree or installable from the configured sources"],"exampleFix":"# before\n$ gem install -g gems.rb   # => Unresolved dependency found during sorting - rake (>= 12) ...\n\n# after\n$ gem install 'rake:>= 12' && gem install -g gems.rb\n# or, if missing deps are acceptable:\n$ gem install -g gems.rb --force","handlingStrategy":"try-catch","validationCode":"# pre-flight: ensure every transitive runtime dep of path/git gems resolves\ndeps = spec.runtime_dependencies.map { |d| \"#{d.name} (#{d.requirement})\" }\nmissing = deps.reject { |name, _| Gem::Specification.find_by_path(name) ||Gem::SpecFetcher.fetcher.spec_for_dependency(Gem::Dependency.new(name)).any? }","typeGuard":null,"tryCatchPattern":"begin\n  request_set.resolve\nrescue Gem::DependencyError => e\n  raise if !e.message.include?('Unresolved dependency')\n  # extract dep from message and pre-install it, or accept partial install:\n  # Gem::DependencyInstaller.new(force: true).install(dep_name)\nend","preventionTips":["Pre-install transitive dependencies of vendored/git gems before `gem install -g`","Pin versions in gems.rb so resolution cannot exclude a required transitive version","Use `gem install --force` when missing transitive deps are expected to be tolerated","Keep vendor trees complete: commit the full unpacked gem, not just its gemspec"],"tags":["rubygems","dependency-resolution","tsort","request-set","transitive-dependency"],"backgroundTag":"dependency-resolution-conflict","analyzedSha":"0e5b888e1c355f3f728f2659f085820937dada48","analyzedAt":"2026-08-21T14:25:43.473Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}