2016-01-07 23:11:47 +00:00
|
|
|
|
// Copyright (c) .NET Foundation and contributors. All rights reserved.
|
|
|
|
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
|
|
|
|
2015-12-17 23:04:18 +00:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using Microsoft.DotNet.ProjectModel;
|
|
|
|
|
using Microsoft.DotNet.ProjectModel.Compilation;
|
|
|
|
|
using Microsoft.DotNet.ProjectModel.Graph;
|
2015-12-21 18:36:20 +00:00
|
|
|
|
using NuGet.Frameworks;
|
2015-12-17 23:04:18 +00:00
|
|
|
|
|
|
|
|
|
namespace Microsoft.Extensions.DependencyModel
|
|
|
|
|
{
|
|
|
|
|
public static class DependencyContextBuilder
|
|
|
|
|
{
|
2015-12-21 18:36:20 +00:00
|
|
|
|
public static DependencyContext Build(CommonCompilerOptions compilerOptions, LibraryExporter libraryExporter, string configuration, NuGetFramework target, string runtime)
|
2015-12-17 23:04:18 +00:00
|
|
|
|
{
|
2015-12-21 18:36:20 +00:00
|
|
|
|
var dependencies = libraryExporter.GetAllExports().Where(export => export.Library.Framework.Equals(target)).ToList();
|
2015-12-17 23:04:18 +00:00
|
|
|
|
|
2015-12-21 18:36:20 +00:00
|
|
|
|
// Sometimes we have package and reference assembly with the same name (System.Runtime for example) thats why we
|
|
|
|
|
// deduplicating them prefering reference assembly
|
|
|
|
|
var dependencyLookup = dependencies
|
|
|
|
|
.OrderBy(export => export.Library.Identity.Type == LibraryType.ReferenceAssembly)
|
|
|
|
|
.GroupBy(export => export.Library.Identity.Name)
|
|
|
|
|
.Select(exports => exports.First())
|
|
|
|
|
.Select(export => new Dependency(export.Library.Identity.Name, export.Library.Identity.Version.ToString()))
|
|
|
|
|
.ToDictionary(dependency => dependency.Name);
|
|
|
|
|
|
|
|
|
|
return new DependencyContext(target.DotNetFrameworkName, runtime,
|
|
|
|
|
GetCompilationOptions(compilerOptions),
|
2016-01-07 23:11:47 +00:00
|
|
|
|
GetLibraries(dependencies, dependencyLookup, target, configuration, runtime: false).Cast<CompilationLibrary>().ToArray(),
|
|
|
|
|
GetLibraries(dependencies, dependencyLookup, target, configuration, runtime: true).Cast<RuntimeLibrary>().ToArray());
|
2015-12-17 23:04:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
2015-12-21 18:36:20 +00:00
|
|
|
|
private static CompilationOptions GetCompilationOptions(CommonCompilerOptions compilerOptions)
|
2015-12-17 23:04:18 +00:00
|
|
|
|
{
|
2015-12-21 18:36:20 +00:00
|
|
|
|
return new CompilationOptions(compilerOptions.Defines,
|
|
|
|
|
compilerOptions.LanguageVersion,
|
|
|
|
|
compilerOptions.Platform,
|
|
|
|
|
compilerOptions.AllowUnsafe,
|
|
|
|
|
compilerOptions.WarningsAsErrors,
|
|
|
|
|
compilerOptions.Optimize,
|
|
|
|
|
compilerOptions.KeyFile,
|
|
|
|
|
compilerOptions.DelaySign,
|
|
|
|
|
compilerOptions.PublicSign,
|
|
|
|
|
compilerOptions.EmitEntryPoint);
|
2015-12-17 23:04:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
2016-01-07 23:11:47 +00:00
|
|
|
|
private static IEnumerable<Library> GetLibraries(IEnumerable<LibraryExport> dependencies,
|
2015-12-21 18:36:20 +00:00
|
|
|
|
IDictionary<string, Dependency> dependencyLookup,
|
|
|
|
|
NuGetFramework target,
|
|
|
|
|
string configuration,
|
2016-01-07 23:11:47 +00:00
|
|
|
|
bool runtime)
|
2015-12-17 23:04:18 +00:00
|
|
|
|
{
|
2016-01-07 23:11:47 +00:00
|
|
|
|
return dependencies.Select(export => GetLibrary(export, target, configuration, runtime, dependencyLookup));
|
2015-12-21 18:36:20 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static Library GetLibrary(LibraryExport export,
|
|
|
|
|
NuGetFramework target,
|
|
|
|
|
string configuration,
|
2016-01-07 23:11:47 +00:00
|
|
|
|
bool runtime,
|
2015-12-21 18:36:20 +00:00
|
|
|
|
IDictionary<string, Dependency> dependencyLookup)
|
|
|
|
|
{
|
|
|
|
|
var type = export.Library.Identity.Type.Value.ToLowerInvariant();
|
|
|
|
|
|
2015-12-17 23:04:18 +00:00
|
|
|
|
var serviceable = (export.Library as PackageDescription)?.Library.IsServiceable ?? false;
|
2015-12-21 18:36:20 +00:00
|
|
|
|
var libraryDependencies = new List<Dependency>();
|
2015-12-17 23:04:18 +00:00
|
|
|
|
|
2016-01-07 23:11:47 +00:00
|
|
|
|
var libraryAssets = runtime ? export.RuntimeAssemblies : export.CompilationAssemblies;
|
|
|
|
|
|
2015-12-21 18:36:20 +00:00
|
|
|
|
foreach (var libraryDependency in export.Library.Dependencies)
|
|
|
|
|
{
|
|
|
|
|
Dependency dependency;
|
|
|
|
|
if (dependencyLookup.TryGetValue(libraryDependency.Name, out dependency))
|
|
|
|
|
{
|
|
|
|
|
libraryDependencies.Add(dependency);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
string[] assemblies;
|
|
|
|
|
if (type == "project")
|
|
|
|
|
{
|
|
|
|
|
var isExe = ((ProjectDescription) export.Library)
|
|
|
|
|
.Project
|
|
|
|
|
.GetCompilerOptions(target, configuration)
|
|
|
|
|
.EmitEntryPoint
|
|
|
|
|
.GetValueOrDefault(false);
|
|
|
|
|
|
|
|
|
|
assemblies = new[] { export.Library.Identity.Name + (isExe ? ".exe": ".dll") };
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
assemblies = libraryAssets.Select(libraryAsset => libraryAsset.RelativePath).ToArray();
|
|
|
|
|
}
|
2015-12-17 23:04:18 +00:00
|
|
|
|
|
2016-01-07 23:11:47 +00:00
|
|
|
|
if (runtime)
|
|
|
|
|
{
|
|
|
|
|
return new RuntimeLibrary(
|
|
|
|
|
type,
|
|
|
|
|
export.Library.Identity.Name,
|
|
|
|
|
export.Library.Identity.Version.ToString(),
|
|
|
|
|
export.Library.Hash,
|
|
|
|
|
assemblies,
|
|
|
|
|
libraryDependencies.ToArray(),
|
|
|
|
|
serviceable
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return new CompilationLibrary(
|
|
|
|
|
type,
|
|
|
|
|
export.Library.Identity.Name,
|
|
|
|
|
export.Library.Identity.Version.ToString(),
|
|
|
|
|
export.Library.Hash,
|
|
|
|
|
assemblies,
|
|
|
|
|
libraryDependencies.ToArray(),
|
|
|
|
|
serviceable
|
|
|
|
|
);
|
|
|
|
|
}
|
2015-12-17 23:04:18 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|