class Licensed::Sources::NuGet
Only supports ProjectReference (project.assets.json) style restore used in .NET Core. Does not currently support packages.config style restore.
Public Class Methods
Source
# File lib/licensed/sources/nuget.rb, line 10 def self.type_and_version ["nuget"] end
Public Instance Methods
Source
# File lib/licensed/sources/nuget.rb, line 184 def enabled? File.exist?(project_assets_file_path) end
Source
# File lib/licensed/sources/nuget.rb, line 191 def enumerate_dependencies reference_keys.map do |reference_key| package_id_parts = reference_key.partition("/") name = package_id_parts[0] version = package_id_parts[-1] id = "#{name}-#{version}" path = full_dependency_path(reference_key) error = "Package #{id} path was not found in project.assets.json, or does not exist on disk at any project package folder" if path.nil? NuGetDependency.new( name: id, version: version, path: path, errors: Array(error), metadata: { "type" => NuGet.type, "name" => name } ) end end
Inspect project.assets.json files for package references. Ideally we’d use ‘dotnet list package` instead, but its output isn’t easily machine readable and doesn’t contain everything we need.
Source
# File lib/licensed/sources/nuget.rb, line 225 def full_dependency_path(reference_key) dependency_path = project_assets_json.dig("libraries", reference_key, "path") return unless dependency_path nuget_package_dirs = [ project_assets_json.dig("project", "restore", "packagesPath"), *Array(project_assets_json.dig("project", "restore", "fallbackFolders")) ].compact nuget_package_dirs.map { |dir| File.join(dir, dependency_path) } .find { |path| File.directory?(path) } end
Returns a dependency’s path, if it exists, in one of the project’s global or fallback package folders
Source
# File lib/licensed/sources/nuget.rb, line 180 def nuget_obj_path config.dig("nuget", "obj_path") || "" end
Source
# File lib/licensed/sources/nuget.rb, line 168 def project_assets_file return @project_assets_file if defined?(@project_assets_file) @project_assets_file = File.read(project_assets_file_path) end
Source
# File lib/licensed/sources/nuget.rb, line 164 def project_assets_file_path File.join(config.pwd, nuget_obj_path, "project.assets.json") end
Source
# File lib/licensed/sources/nuget.rb, line 173 def project_assets_json @project_assets_json ||= JSON.parse(project_assets_file) rescue JSON::ParserError => e message = "Licensed was unable to read the project.assets.json file. Error: #{e.message}" raise Licensed::Sources::Source::Error, message end
Source
# File lib/licensed/sources/nuget.rb, line 215 def reference_keys all_reference_keys = project_assets_json["targets"].flat_map do |_, references| references.select { |key, reference| reference["type"] == "package" } .keys end Set.new(all_reference_keys) end
Returns a unique set of the package reference keys used across all target groups