/// <inheritdoc/> public void Scan(IAggregator aggregator, Dictionary <string, PackageDeclaration> output) { if (aggregator == null || aggregator.RootPath == null) { throw new ArgumentNullException($"{nameof(aggregator)} or one of its property must not be null."); } if (output == null) { throw new ArgumentNullException($"{nameof(output)} must not be null."); } var nugetFiles = Directory.EnumerateFiles( aggregator.RootPath, "*.nuspec", SearchOption.AllDirectories).ToArray(); var xmlNsResolver = new NsResolver( new Dictionary <string, string>() { { "n", "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd" }, }); foreach (var nugetFile in nugetFiles) { var nuspecFileName = Path.GetFileNameWithoutExtension(nugetFile); var nugetName = nuspecFileName; using var nugetFileStream = File.OpenRead(nugetFile); using var xmlReader = XmlReader.Create(nugetFileStream); var xmlProj = XDocument.Load(xmlReader); var packageId = xmlProj.XPathSelectElements( "/n:package/n:metadata/n:id", xmlNsResolver) .SingleOrDefault(); if (packageId != null) { nugetName = packageId.Value; } // match with the project name var prj = aggregator.AllProjects.Where(p => p.Name == nugetName || p.Name == nuspecFileName).FirstOrDefault(); if (prj != null && !output.ContainsKey(nugetName)) { var version = xmlProj.XPathSelectElements( "/n:package/n:metadata/n:version", xmlNsResolver) .SingleOrDefault(); output.Add(nugetName, new PackageDeclaration(nugetFile, nugetName, version?.Value, new[] { prj })); } } }
/// <inheritdoc/> public void Scan(IAggregator aggregator, Dictionary <string, PackageDeclaration> output) { if (aggregator == null || aggregator.RootPath == null) { throw new ArgumentNullException($"{nameof(aggregator)} or one of its property must not be null."); } if (output == null) { throw new ArgumentNullException($"{nameof(output)} must not be null."); } var nugetFiles = Directory.EnumerateFiles( aggregator.RootPath, "*.nuspec", SearchOption.AllDirectories).ToArray(); var xmlNsResolver = new NsResolver( new Dictionary <string, string>() { { "n", "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd" }, }); foreach (var nugetFile in nugetFiles) { var nuspecFileName = Path.GetFileNameWithoutExtension(nugetFile); var nugetName = nuspecFileName; using var nugetFileStream = File.OpenRead(nugetFile); using var xmlReader = XmlReader.Create(nugetFileStream); var xmlProj = XDocument.Load(xmlReader); var packageId = xmlProj.XPathSelectElements( "/n:package/n:metadata/n:id", xmlNsResolver) .SingleOrDefault(); if (packageId != null) { nugetName = packageId.Value; } // match with the project name var prj = aggregator.AllProjects.Where(p => p.Name == nugetName || p.Name == nuspecFileName).FirstOrDefault(); if (prj != null && !output.ContainsKey(nugetName)) { var version = xmlProj.XPathSelectElements( "/n:package/n:metadata/n:version", xmlNsResolver) .SingleOrDefault(); output.Add(nugetName, new PackageDeclaration(nugetFile, nugetName, version?.Value, new[] { prj })); } else { // Scan files elements. var fileElements = xmlProj.XPathSelectElements( "/n:package/n:files/n:file", xmlNsResolver); var projects = new List <Project>(); foreach (var fileElement in fileElements) { var srcAttribute = fileElement.Attributes().SingleOrDefault(a => a.Name.LocalName == "src"); var targetAttribute = fileElement.Attributes().SingleOrDefault(a => a.Name.LocalName == "target"); if (srcAttribute != null && targetAttribute != null) { var src = srcAttribute.Value; var target = targetAttribute.Value; if (target.StartsWith("lib", StringComparison.InvariantCultureIgnoreCase) && src.EndsWith(".dll", StringComparison.InvariantCultureIgnoreCase)) { src = src.Replace("\\", "/", StringComparison.InvariantCulture); var assemblyName = Path.GetFileNameWithoutExtension(src); var assemblyPrj = aggregator.AllProjects.Where(p => p.Name == assemblyName).FirstOrDefault(); if (assemblyPrj != null) { projects.Add(assemblyPrj); } } } } if (projects.Any() && !output.ContainsKey(nugetName)) { var version = xmlProj.XPathSelectElements( "/n:package/n:metadata/n:version", xmlNsResolver) .SingleOrDefault(); output.Add(nugetName, new PackageDeclaration(nugetFile, nugetName, version?.Value, projects)); } } } }