-
Notifications
You must be signed in to change notification settings - Fork 697
/
FrameworkNameUtility.cs
155 lines (131 loc) · 6.16 KB
/
FrameworkNameUtility.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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
// 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.IO;
using System.Linq;
using System.Runtime.Versioning;
using NuGet.Frameworks;
namespace NuGet.Packaging
{
public static class FrameworkNameUtility
{
public static FrameworkName ParseFrameworkNameFromFilePath(string filePath, out string effectivePath)
{
foreach (string knownFolder in PackagingConstants.Folders.Known)
{
string folderPrefix = knownFolder + System.IO.Path.DirectorySeparatorChar;
if (filePath.Length > folderPrefix.Length &&
filePath.StartsWith(folderPrefix, StringComparison.OrdinalIgnoreCase))
{
string frameworkPart = filePath.Substring(folderPrefix.Length);
try
{
return FrameworkNameUtility.ParseFrameworkFolderName(
frameworkPart,
strictParsing: knownFolder == PackagingConstants.Folders.Lib,
effectivePath: out effectivePath);
}
catch (ArgumentException)
{
// if the parsing fails, we treat it as if this file
// doesn't have target framework.
effectivePath = frameworkPart;
return null;
}
}
}
effectivePath = filePath;
return null;
}
/// <summary>
/// Parses the specified string into FrameworkName object.
/// </summary>
/// <param name="path">The string to be parse.</param>
/// <param name="strictParsing">if set to <see langword="true" />, parse the first folder of path even if it is unrecognized framework.</param>
/// <param name="effectivePath">returns the path after the parsed target framework</param>
/// <returns></returns>
public static FrameworkName ParseFrameworkFolderName(string path, bool strictParsing, out string effectivePath)
{
// The path for a reference might look like this for assembly foo.dll:
// foo.dll
// sub\foo.dll
// {FrameworkName}{Version}\foo.dll
// {FrameworkName}{Version}\sub1\foo.dll
// {FrameworkName}{Version}\sub1\sub2\foo.dll
// Get the target framework string if specified
string targetFrameworkString = Path.GetDirectoryName(path).Split(Path.DirectorySeparatorChar).First();
effectivePath = path;
if (string.IsNullOrEmpty(targetFrameworkString))
{
return null;
}
var nugetFramework = NuGetFramework.ParseFolder(targetFrameworkString);
if (strictParsing || nugetFramework.IsSpecificFramework)
{
// skip past the framework folder and the character \
effectivePath = path.Substring(targetFrameworkString.Length + 1);
return new FrameworkName(nugetFramework.DotNetFrameworkName);
}
return null;
}
public static NuGetFramework ParseNuGetFrameworkFromFilePath(string filePath, out string effectivePath)
{
foreach (string knownFolder in PackagingConstants.Folders.Known)
{
string folderPrefix = knownFolder + System.IO.Path.DirectorySeparatorChar;
if (filePath.Length > folderPrefix.Length &&
filePath.StartsWith(folderPrefix, StringComparison.OrdinalIgnoreCase))
{
string frameworkPart = filePath.Substring(folderPrefix.Length);
try
{
return FrameworkNameUtility.ParseNuGetFrameworkFolderName(
frameworkPart,
strictParsing: knownFolder == PackagingConstants.Folders.Lib,
effectivePath: out effectivePath);
}
catch (ArgumentException)
{
// if the parsing fails, we treat it as if this file
// doesn't have target framework.
effectivePath = frameworkPart;
return null;
}
}
}
effectivePath = filePath;
return null;
}
/// <summary>
/// Parses the specified string into FrameworkName object.
/// </summary>
/// <param name="path">The string to be parse.</param>
/// <param name="strictParsing">if set to <see langword="true" />, parse the first folder of path even if it is unrecognized framework.</param>
/// <param name="effectivePath">returns the path after the parsed target framework</param>
/// <returns></returns>
public static NuGetFramework ParseNuGetFrameworkFolderName(string path, bool strictParsing, out string effectivePath)
{
// The path for a reference might look like this for assembly foo.dll:
// foo.dll
// sub\foo.dll
// {FrameworkName}{Version}\foo.dll
// {FrameworkName}{Version}\sub1\foo.dll
// {FrameworkName}{Version}\sub1\sub2\foo.dll
// Get the target framework string if specified
string targetFrameworkString = Path.GetDirectoryName(path).Split(Path.DirectorySeparatorChar).First();
effectivePath = path;
if (string.IsNullOrEmpty(targetFrameworkString))
{
return null;
}
var nugetFramework = NuGetFramework.ParseFolder(targetFrameworkString);
if (strictParsing || nugetFramework.IsSpecificFramework)
{
// skip past the framework folder and the character \
effectivePath = path.Substring(targetFrameworkString.Length + 1);
return nugetFramework;
}
return null;
}
}
}