forked from scriptcs/scriptcs
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPackageAssemblyResolver.cs
More file actions
126 lines (107 loc) · 4.92 KB
/
PackageAssemblyResolver.cs
File metadata and controls
126 lines (107 loc) · 4.92 KB
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
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using ScriptCs.Contracts;
namespace ScriptCs
{
public class PackageAssemblyResolver : IPackageAssemblyResolver
{
private readonly IFileSystem _fileSystem;
private readonly IPackageContainer _packageContainer;
private readonly ILog _logger;
private readonly IAssemblyUtility _assemblyUtility;
private List<IPackageReference> _topLevelPackages;
public PackageAssemblyResolver(
IFileSystem fileSystem, IPackageContainer packageContainer, ILogProvider logProvider, IAssemblyUtility assemblyUtility)
{
Guard.AgainstNullArgument("fileSystem", fileSystem);
Guard.AgainstNullArgumentProperty("fileSystem", "PackagesFolder", fileSystem.PackagesFolder);
Guard.AgainstNullArgumentProperty("fileSystem", "PackagesFile", fileSystem.PackagesFile);
Guard.AgainstNullArgument("packageContainer", packageContainer);
Guard.AgainstNullArgument("logProvider", logProvider);
Guard.AgainstNullArgument("assemblyUtility", assemblyUtility);
_fileSystem = fileSystem;
_packageContainer = packageContainer;
_logger = logProvider.ForCurrentType();
_assemblyUtility = assemblyUtility;
}
public void SavePackages()
{
var packagesFolder = Path.Combine(_fileSystem.CurrentDirectory, _fileSystem.PackagesFolder);
if (!_fileSystem.DirectoryExists(packagesFolder))
{
_logger.Warn("Packages directory does not exist!");
return;
}
_packageContainer.CreatePackageFile();
}
public IEnumerable<IPackageReference> GetPackages(string workingDirectory)
{
var packagesFile = Path.Combine(workingDirectory, _fileSystem.PackagesFile);
_topLevelPackages = _packageContainer.FindReferences(packagesFile).ToList();
return _topLevelPackages.ToArray();
}
public IEnumerable<string> GetAssemblyNames(string workingDirectory)
{
var packages = GetPackages(workingDirectory).ToList();
if (!packages.Any())
{
return Enumerable.Empty<string>();
}
var packagesFile = Path.Combine(workingDirectory, _fileSystem.PackagesFile);
var packagesFolder = Path.Combine(workingDirectory, _fileSystem.PackagesFolder);
var names = new List<string>();
GetAssemblyNames(packagesFolder, packages, names, _fileSystem.FileExists(packagesFile));
return names;
}
private void GetAssemblyNames(
string packageDir,
IEnumerable<IPackageReference> packageReferences,
ICollection<string> names,
bool strictLoad)
{
foreach (var packageReference in packageReferences)
{
var packageObject = _packageContainer.FindPackage(packageDir, packageReference);
if (packageObject == null)
{
_logger.WarnFormat(
"Cannot find: {0} {1}",
packageReference.PackageId,
packageReference.Version);
continue;
}
var compatibleDlls = packageObject.GetCompatibleDlls(packageReference.FrameworkName);
if (compatibleDlls == null)
{
_logger.WarnFormat(
"Cannot find compatible binaries for {0} in: {1} {2}",
packageReference.FrameworkName,
packageReference.PackageId,
packageReference.Version);
continue;
}
foreach (var name in compatibleDlls
.Select(packageFile => Path.Combine(packageDir, packageObject.FullName, packageFile))
.Where(path => _assemblyUtility.IsManagedAssembly(path))
.Concat(packageObject.FrameworkAssemblies)
.Where(name => !names.Contains(name)))
{
names.Add(name);
_logger.Debug("Found: " + name);
}
if (packageObject.Dependencies == null || !packageObject.Dependencies.Any() || !strictLoad)
{
continue;
}
var dependencyReferences = packageObject.Dependencies
.Where(dependency =>
_topLevelPackages.All(topLevelPackage => topLevelPackage.PackageId != dependency.Id))
.Select(dependency =>
new PackageReference(dependency.Id, dependency.FrameworkName, dependency.Version));
GetAssemblyNames(packageDir, dependencyReferences, names, true);
}
}
}
}