private static PackageInput GetPackageInput(string file, ILogger log) { // Validate package log.LogInformation($"Reading {file}"); PackageIdentity identity = null; var isSymbolsPackage = false; var hasNuspec = false; var hasMultipleNuspecs = false; var nuspecName = string.Empty; try { // Read basic info from the package and verify that it isn't broken. using (var zip = new ZipArchive(File.OpenRead(file), ZipArchiveMode.Read, leaveOpen: false)) using (var package = new PackageArchiveReader(zip)) { identity = package.GetIdentity(); isSymbolsPackage = SymbolsUtility.IsSymbolsPackage(zip, file); // Check for correct nuspec name nuspecName = identity.Id + ".nuspec"; var nuspecs = zip.Entries.Where(entry => entry.FullName.EndsWith(".nuspec", StringComparison.OrdinalIgnoreCase)).ToList(); hasNuspec = nuspecs.Count == 1; hasMultipleNuspecs = nuspecs.Count > 1; } } catch { log.LogError($"Invalid package '{file}'."); throw; } var packageInput = new PackageInput(file, identity, isSymbolsPackage); // Display a message for non-normalized packages if (packageInput.Identity.Version.ToString() != packageInput.Identity.Version.ToNormalizedString()) { var message = $"Package '{packageInput.PackagePath}' does not contain a normalized version. Normalized: '{packageInput.Identity.Version.ToNormalizedString()}' Nuspec version: '{packageInput.Identity.Version.ToString()}'. See https://semver.org/ for details."; log.LogVerbose(message); } // Check for correct nuspec name if (!hasNuspec) { throw new InvalidDataException($"'{packageInput.PackagePath}' does not contain '{nuspecName}'."); } // Check for multiple nuspec files if (hasMultipleNuspecs) { throw new InvalidDataException($"'{packageInput.PackagePath}' contains multiple nuspecs and cannot be consumed."); } return(packageInput); }
/// <summary> /// Create a package input from the given file path. /// </summary> public static PackageInput Create(string file) { PackageInput result = null; using (var zip = new ZipArchive(File.OpenRead(file), ZipArchiveMode.Read, leaveOpen: false)) using (var reader = new PackageArchiveReader(file)) { var isSymbolsPackage = SymbolsUtility.IsSymbolsPackage(zip, file); result = new PackageInput(file, isSymbolsPackage, reader.NuspecReader); } return(result); }