forked from dotnet/sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLockFileExtensions.cs
129 lines (110 loc) · 4.68 KB
/
LockFileExtensions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// 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.
using System;
using System.Collections.Generic;
using System.Linq;
using NuGet.Frameworks;
using NuGet.Packaging.Core;
using NuGet.ProjectModel;
namespace Microsoft.NET.Build.Tasks
{
public static class LockFileExtensions
{
public static ProjectContext CreateProjectContext(
this LockFile lockFile,
NuGetFramework framework,
string runtime,
string platformLibraryName)
{
if (lockFile == null)
{
throw new ArgumentNullException(nameof(lockFile));
}
if (framework == null)
{
throw new ArgumentNullException(nameof(framework));
}
LockFileTarget lockFileTarget = lockFile.GetTarget(framework, runtime);
if (lockFileTarget == null)
{
string frameworkString = framework.DotNetFrameworkName;
string targetMoniker = string.IsNullOrEmpty(runtime) ?
frameworkString :
$"{frameworkString}/{runtime}";
throw new BuildErrorException(Strings.AssetsFileMissingTarget, lockFile.Path, targetMoniker, framework.GetShortFolderName(), runtime);
}
return new ProjectContext(lockFile, lockFileTarget, platformLibraryName);
}
public static LockFileTargetLibrary GetLibrary(this LockFileTarget lockFileTarget, string libraryName)
{
if (string.IsNullOrEmpty(libraryName))
{
return null;
}
return lockFileTarget
.Libraries
.FirstOrDefault(e => e.Name.Equals(libraryName, StringComparison.OrdinalIgnoreCase));
}
private static readonly char[] DependencySeparators = new char[] { '<', '=', '>' };
public static Dictionary<string, string> GetProjectFileDependencies(this LockFile lockFile)
{
var projectDeps = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
foreach (var group in lockFile.ProjectFileDependencyGroups)
{
foreach (var dep in group.Dependencies)
{
var parts = dep.Split(DependencySeparators, StringSplitOptions.RemoveEmptyEntries);
var packageName = parts[0].Trim();
if (!projectDeps.ContainsKey(packageName))
{
projectDeps.Add(packageName, parts.Length == 2 ? parts[1].Trim() : null);
}
}
}
return projectDeps;
}
public static HashSet<string> GetPlatformExclusionList(
this LockFileTarget lockFileTarget,
LockFileTargetLibrary platformLibrary,
IDictionary<string, LockFileTargetLibrary> libraryLookup)
{
var exclusionList = new HashSet<string>();
exclusionList.Add(platformLibrary.Name);
CollectDependencies(libraryLookup, platformLibrary.Dependencies, exclusionList);
return exclusionList;
}
private static void CollectDependencies(
IDictionary<string, LockFileTargetLibrary> libraryLookup,
IEnumerable<PackageDependency> dependencies,
HashSet<string> exclusionList)
{
foreach (PackageDependency dependency in dependencies)
{
LockFileTargetLibrary library = libraryLookup[dependency.Id];
if (library.Version.Equals(dependency.VersionRange.MinVersion))
{
if (exclusionList.Add(library.Name))
{
CollectDependencies(libraryLookup, library.Dependencies, exclusionList);
}
}
}
}
public static IEnumerable<LockFileTargetLibrary> Filter(
this IEnumerable<LockFileTargetLibrary> libraries,
HashSet<string> exclusionList)
{
return libraries.Where(e => !exclusionList.Contains(e.Name));
}
public static IEnumerable<IGrouping<string, LockFileRuntimeTarget>> GetRuntimeTargetsGroups(
this LockFileTargetLibrary library,
string assetType)
{
return library.RuntimeTargets
.FilterPlaceHolderFiles()
.Cast<LockFileRuntimeTarget>()
.Where(t => string.Equals(t.AssetType, assetType, StringComparison.OrdinalIgnoreCase))
.GroupBy(t => t.Runtime);
}
}
}