Skip to content

Instantly share code, notes, and snippets.

@bf4
Last active January 10, 2023 15:39
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bf4/6731278 to your computer and use it in GitHub Desktop.
Save bf4/6731278 to your computer and use it in GitHub Desktop.
resolve gem dependencies
require 'rubygems'
# https://github.com/rubygems/rubygems/blob/master/lib/rubygems/specification.rb#L981
gemspec = 'foo.gemspec'
spec = Gem::Specification.load(gemspec) # from_yaml
spec.dependencies # type (runtime), name (activesupport), requirements (">= 0")
require 'bundler'
# https://github.com/bundler/bundler/blob/master/lib/bundler/source/rubygems.rb
# https://github.com/bundler/bundler/blob/master/lib/bundler/resolver.rb
# https://github.com/rubygems/rubygems/blob/master/lib/rubygems/dependency_resolver.rb
gems = %w(metric_fu).map do |name|
Gem::Dependency.new(name, ['>= 0'], :runtime)
end.select{|gem| gem.type == :runtime}
def resolve(gems)
gem_deps = gems.map do |gem|
Bundler::Dependency.new(gem.name, :version => gem.requirement)
end
platforms = %w(ruby)
deps = platforms.flat_map do |platform|
gem_deps.map do |dep|
Bundler::DepProxy.new(dep, platform)
end
end
index = Bundler::Source::Rubygems.new.specs # Bundler.rubygems.all_specs
Bundler::Resolver.resolve(deps, index)
end
resolved_deps = resolve(gems)
resolved_deps.map{|gem|
[gem.name, gem.version.to_s] # dependencies, source, platform, full_name
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment