// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Linq; using System.IO; using Microsoft.DotNet.ProjectModel; using Microsoft.Extensions.ProjectModel.Resolution; using Microsoft.DotNet.Cli.Utils; namespace Microsoft.Extensions.ProjectModel { internal class DotNetDependencyProvider { private ProjectContext _context; private List _packageDependencies; private List _resolvedReferences; private string _configuration; public DotNetDependencyProvider(ProjectContext context, string configuration = Constants.DefaultConfiguration) { if (context == null) { throw new ArgumentNullException(nameof(context)); } _configuration = configuration; _context = context; DiscoverDependencies(); } public IEnumerable GetPackageDependencies() { return _packageDependencies; } public IEnumerable GetResolvedReferences() { return _resolvedReferences; } private void DiscoverDependencies() { var exporter = _context.CreateExporter(_configuration); if (exporter == null) { throw new InvalidOperationException($"Couldn't create a library exporter for configuration {_configuration}"); } var framework = _context.TargetFramework; if (framework == null) { throw new InvalidOperationException("Couldn't resolve dependencies when target framework is not specified."); } var exports = exporter.GetAllExports(); var nugetPackages = new Dictionary(StringComparer.OrdinalIgnoreCase); _resolvedReferences = new List(); foreach (var export in exports) { var library = export.Library; var description = new DependencyDescription( library.Identity.Name, library.Identity.Version.ToString(), export.Library.Path, framework.DotNetFrameworkName, library.Identity.Type.Value, library.Resolved); foreach (var dependency in export.Library.Dependencies) { var dep = new Dependency(dependency.Name, version: string.Empty); description.AddDependency(dep); } var itemSpec = $"{framework.DotNetFrameworkName}/{library.Identity.Name}/{library.Identity.Version.ToString()}"; nugetPackages[itemSpec] = description; if (library.Resolved) { foreach (var asset in export.CompilationAssemblies) { var resolvedRef = new ResolvedReference( name: Path.GetFileNameWithoutExtension(asset.FileName), resolvedPath: asset.ResolvedPath); _resolvedReferences.Add(resolvedRef); } } } _packageDependencies = nugetPackages.Values.ToList(); } } }