public void NuspecReaderTests_FrameworkGroups() { NuspecReader reader = GetReader(CommaDelimitedFrameworksNuspec); var dependencies = reader.GetFrameworkReferenceGroups().ToList(); Assert.Equal(5, dependencies.Count); }
public static PackageMetadata FromNuspecReader(NuspecReader nuspecReader) { return(new PackageMetadata( nuspecReader.GetMetadata().ToDictionary(kvp => kvp.Key, kvp => kvp.Value), nuspecReader.GetDependencyGroups(), nuspecReader.GetFrameworkReferenceGroups() )); }
/// <summary> /// Gets package metadata from a the provided <see cref="NuspecReader"/> instance. /// </summary> /// <param name="nuspecReader">The <see cref="NuspecReader"/> instance used to read the <see cref="PackageMetadata"/></param> /// <param name="strict"> /// Whether or not to be strict when reading the <see cref="NuspecReader"/>. This should be <code>true</code> /// on initial ingestion but false when a package that has already been accepted is being processed.</param> /// <exception cref="PackagingException"> /// We default to use a strict version-check on dependency groups. /// When an invalid dependency version range is detected, a <see cref="PackagingException"/> will be thrown. /// </exception> public static PackageMetadata FromNuspecReader(NuspecReader nuspecReader, bool strict) { return(new PackageMetadata( nuspecReader.GetMetadata().ToDictionary(kvp => kvp.Key, kvp => kvp.Value), nuspecReader.GetDependencyGroups(useStrictVersionCheck: strict), nuspecReader.GetFrameworkReferenceGroups(), nuspecReader.GetPackageTypes(), nuspecReader.GetMinClientVersion() )); }
/// <summary> /// Gets package metadata from a the provided <see cref="NuspecReader"/> instance. /// </summary> /// <param name="nuspecReader">The <see cref="NuspecReader"/> instance used to read the <see cref="PackageMetadata"/></param> /// <param name="strict"> /// Whether or not to be strict when reading the <see cref="NuspecReader"/>. This should be <code>true</code> /// on initial ingestion but false when a package that has already been accepted is being processed.</param> /// <exception cref="PackagingException"> /// We default to use a strict version-check on dependency groups. /// When an invalid dependency version range is detected, a <see cref="PackagingException"/> will be thrown. /// </exception> public static PackageMetadata FromNuspecReader(NuspecReader nuspecReader, bool strict) { var strictNuspecReader = new StrictNuspecReader(nuspecReader.Xml); var metadataLookup = strictNuspecReader.GetMetadataLookup(); if (strict) { var duplicates = metadataLookup .Where(g => g.Count() > 1) .Select(g => g.Key) .ToList(); if (duplicates.Any()) { throw new PackagingException(string.Format( CoreStrings.Manifest_DuplicateMetadataElements, string.Join("', '", duplicates))); } } // Reject invalid metadata element names. Today this only rejects element names that collide with // properties generated downstream. var metadataKeys = new HashSet <string>(metadataLookup.Select(g => g.Key)); metadataKeys.IntersectWith(RestrictedMetadataElements); if (metadataKeys.Any()) { throw new PackagingException(string.Format( CoreStrings.Manifest_InvalidMetadataElements, string.Join("', '", metadataKeys.OrderBy(x => x)))); } // Reject non-boolean values for boolean metadata. foreach (var booleanName in BooleanMetadataElements) { foreach (var unparsedBoolean in metadataLookup[booleanName]) { if (!bool.TryParse(unparsedBoolean, out var parsedBoolean)) { throw new PackagingException(string.Format( CoreStrings.Manifest_InvalidBooleanMetadata, booleanName)); } } } return(new PackageMetadata( nuspecReader.GetMetadata().ToDictionary(kvp => kvp.Key, kvp => kvp.Value), nuspecReader.GetDependencyGroups(useStrictVersionCheck: strict), nuspecReader.GetFrameworkReferenceGroups(), nuspecReader.GetPackageTypes(), nuspecReader.GetMinClientVersion(), nuspecReader.GetRepositoryMetadata(), nuspecReader.GetLicenseMetadata())); }
public async Task GivenThatIAddMultipleFrameworkAssembliesToAnEmptyNuspecVerifyItIsAdded() { using (var workingDir = new TestFolder()) { // Arrange var nuspec = new TestNuspec() { Id = "a", Version = "1.0.0" }; var nupkg = nuspec.CreateNupkg(); nupkg.Files.Clear(); nupkg.AddFile("lib/net45/a.dll"); nupkg.AddFile("lib/netstandard1.0/a.dll"); var path = nupkg.Save(workingDir).FullName; var log = new TestLogger(); // Act var exitCode = await Program.MainCore(new[] { "nuspec", "frameworkassemblies", "add", path, "--assembly-name", "testA", "--assembly-name", "testB", "--framework", "net60", "--framework", "net70" }, log); NuspecReader reader = null; using (var package = new PackageArchiveReader(path)) { reader = package.NuspecReader; } // Assert exitCode.Should().Be(0, "no errors"); reader.GetFrameworkReferenceGroups().Count().Should().Be(2); reader.GetFrameworkReferenceGroups().Select(e => e.TargetFramework.GetShortFolderName()).ShouldBeEquivalentTo(new[] { "net60", "net70" }); foreach (var group in reader.GetFrameworkReferenceGroups()) { group.Items.ShouldBeEquivalentTo(new[] { "testA", "testB" }); } } }
/// <summary> /// Read dependency info from a nuspec. /// </summary> /// <remarks>This also verifies minClientVersion.</remarks> protected static FindPackageByIdDependencyInfo GetDependencyInfo(NuspecReader reader) { // Since this is the first place a package is read after selecting it as the best version // check the minClientVersion here to verify we are okay to read this package. MinClientVersionUtility.VerifyMinClientVersion(reader); // Create dependency info return(new FindPackageByIdDependencyInfo( reader.GetDependencyGroups(), reader.GetFrameworkReferenceGroups())); }
private IEnumerable <LibraryDependency> GetDependencies(NuspecReader nuspecReader, NuGetFramework targetFramework) { var dependencies = NuGetFrameworkUtility.GetNearest(nuspecReader.GetDependencyGroups(), targetFramework, item => item.TargetFramework); var frameworkAssemblies = NuGetFrameworkUtility.GetNearest(nuspecReader.GetFrameworkReferenceGroups(), targetFramework, item => item.TargetFramework); return(GetDependencies(targetFramework, dependencies, frameworkAssemblies)); }
public void NuspecReaderTests_FrameworkSplitGroup() { NuspecReader reader = GetReader(CommaDelimitedFrameworksNuspec); var groups = reader.GetFrameworkReferenceGroups(); var group = groups.Where(e => e.TargetFramework.Equals(NuGetFramework.Parse("net40"))).Single(); Assert.Equal(2, group.Items.Count()); Assert.Equal("System.Net", group.Items.ToArray()[0]); Assert.Equal("System.Web", group.Items.ToArray()[1]); }
public async Task GivenThatIAddAFrameworkAssemblyToAnEmptyNuspecVerifyItIsAdded() { using (var workingDir = new TestFolder()) { // Arrange var nuspec = new TestNuspec() { Id = "a", Version = "1.0.0" }; var nupkg = nuspec.CreateNupkg(); nupkg.Files.Clear(); nupkg.AddFile("lib/net45/a.dll"); nupkg.AddFile("lib/netstandard1.0/a.dll"); var path = nupkg.Save(workingDir).FullName; var log = new TestLogger(); // Act var exitCode = await Program.MainCore(new[] { "nuspec", "frameworkassemblies", "add", path, "--assembly-name", "test" }, log); NuspecReader reader = null; using (var package = new PackageArchiveReader(path)) { reader = package.NuspecReader; } // Assert exitCode.Should().Be(0, "no errors"); reader.GetFrameworkReferenceGroups().Count().Should().Be(1, "packages based frameworks are ignored"); reader.GetFrameworkReferenceGroups().Single().Items.Count().Should().Be(1); reader.GetFrameworkReferenceGroups().Single().Items.Single().Should().Be("test"); reader.GetFrameworkReferenceGroups().Single().TargetFramework.ShouldBeEquivalentTo(NuGetFramework.Parse("net45")); } }
/// <summary> /// Add framework references. /// </summary> private static void AddFrameworkReferences(LockFileTargetLibrary lockFileLib, NuGetFramework framework, NuspecReader nuspec) { // Exclude framework references for package based frameworks. if (!framework.IsPackageBased) { var frameworkAssemblies = nuspec.GetFrameworkReferenceGroups().GetNearest(framework); if (frameworkAssemblies != null) { foreach (var assemblyReference in frameworkAssemblies.Items) { lockFileLib.FrameworkAssemblies.Add(assemblyReference); } } } }
public ServerPackage(NuspecReader package, PackageDerivedData packageDerivedData) { Id = package.GetId(); Version = package.GetVersion(); Title = package.GetTitle(); Authors = package.GetAuthors(); Owners = package.GetOwners(); IconUrl = package.GetIconUrl(); LicenseUrl = package.GetLicenseUrl(); ProjectUrl = package.GetProjectUrl(); RequireLicenseAcceptance = package.GetRequireLicenseAcceptance(); DevelopmentDependency = package.GetDevelopmentDependency(); Description = package.GetDescription(); Summary = package.GetSummary(); ReleaseNotes = package.GetReleaseNotes(); Language = package.GetLanguage(); Tags = package.GetTags(); Copyright = package.GetCopyright(); MinClientVersion = package.GetMinClientVersion(); ReportAbuseUrl = null; DownloadCount = 0; SemVer1IsAbsoluteLatest = false; SemVer1IsLatest = false; SemVer2IsAbsoluteLatest = false; SemVer2IsLatest = false; //FIXME is this OK? Listed = true; IsSemVer2 = IsPackageSemVer2(package); _dependencySets = package.GetDependencyGroups().ToList(); Dependencies = _dependencySets.DependencySetsAsString(); _supportedFrameworks = package.GetFrameworkReferenceGroups().Select(f => f.TargetFramework).ToList(); SupportedFrameworks = string.Join("|", _supportedFrameworks.Select(f => f.GetFrameworkString())); PackageSize = packageDerivedData.PackageSize; PackageHash = packageDerivedData.PackageHash; PackageHashAlgorithm = packageDerivedData.PackageHashAlgorithm; LastUpdated = packageDerivedData.LastUpdated; Created = packageDerivedData.Created; Path = packageDerivedData.Path; FullPath = packageDerivedData.FullPath; }
private void WriteLockFile(string projectLockFilePath, HashSet <Library> graphItems, NuGetv3LocalRepository repository) { var excludes = new[] { ".nuspec", ".nupkg", ".sha512" }; var lockFile = new LockFile(); lockFile.Islocked = false; foreach (var item in graphItems.OrderBy(x => x.Name)) { var package = repository.FindPackagesById(item.Name).FirstOrDefault(p => p.Version == item.Version); if (package != null) { NuspecReader nuspecReader = null; using (var stream = File.OpenRead(package.ManifestPath)) { nuspecReader = new NuspecReader(stream); } var library = new LockFileLibrary(); library.Name = item.Name; library.Version = item.Version; library.FrameworkReferenceGroups = nuspecReader.GetFrameworkReferenceGroups().ToList(); library.ReferenceGroups = nuspecReader.GetReferenceGroups().ToList(); library.DependencyGroups = nuspecReader.GetDependencyGroups().ToList(); library.Files = Directory.EnumerateFiles(package.ExpandedPath, "*.*", SearchOption.AllDirectories) .Where(path => !excludes.Contains(Path.GetExtension(path))) .Select(path => path.Substring(package.ExpandedPath.Length).TrimStart(Path.DirectorySeparatorChar).Replace(Path.DirectorySeparatorChar, '/')) .ToList(); lockFile.Libraries.Add(library); } } var lockFileFormat = new LockFileFormat(); lockFileFormat.Write(projectLockFilePath, lockFile); }
private IEnumerable <LibraryDependency> GetDependencies(LocalPackageInfo package, NuGetFramework targetFramework) { NuspecReader nuspecReader = null; using (var stream = File.OpenRead(package.ManifestPath)) { nuspecReader = new NuspecReader(stream); } var reducer = new FrameworkReducer(); var deps = nuspecReader.GetDependencyGroups() .ToDictionary(g => new NuGetFramework(g.TargetFramework), g => g.Packages); var nearest = reducer.GetNearest(targetFramework, deps.Keys); if (nearest != null) { foreach (var d in deps[nearest]) { yield return(new LibraryDependency { LibraryRange = new LibraryRange { Name = d.Id, VersionRange = d.VersionRange == null ? null : new NuGetVersionRange(d.VersionRange) } }); } } // TODO: Remove this when we do #596 // ASP.NET Core isn't compatible with generic PCL profiles //if (string.Equals(targetFramework.Identifier, VersionUtility.AspNetCoreFrameworkIdentifier, StringComparison.OrdinalIgnoreCase)) //{ // yield break; //} var frameworks = nuspecReader.GetFrameworkReferenceGroups() .ToDictionary(f => f.TargetFramework, f => f.Items); nearest = reducer.GetNearest(targetFramework, frameworks.Keys) ?? frameworks.Keys.FirstOrDefault(f => f.AnyPlatform); if (nearest != null) { if (nearest.AnyPlatform && !targetFramework.IsDesktop()) { // REVIEW: This isn't 100% correct since none *can* mean // any in theory, but in practice it means .NET full reference assembly // If there's no supported target frameworks and we're not targeting // the desktop framework then skip it. // To do this properly we'll need all reference assemblies supported // by each supported target framework which isn't always available. yield break; } foreach (var name in frameworks[nearest]) { yield return(new LibraryDependency { LibraryRange = new LibraryRange { Name = name, IsGacOrFrameworkReference = true } }); } } }
/// <summary> /// Create a PackageDetails page that contains all the package information. /// </summary> public JObject CreatePackageDetails(PackageInput packageInput) { var now = DateTimeOffset.UtcNow; var package = packageInput.Package; var nuspec = XDocument.Load(package.GetNuspec()); var nuspecReader = new NuspecReader(nuspec); var pageId = Guid.NewGuid().ToString().ToLowerInvariant(); var rootUri = UriUtility.CreateUri($"{_context.Source.BaseURI}catalog/data/{pageId}.json"); packageInput.PackageDetailsUri = rootUri; var json = JsonUtility.Create(rootUri, new List <string>() { "PackageDetails", "catalog:Permalink" }); json.Add("commitId", _context.CommitId.ToString().ToLowerInvariant()); json.Add("commitTimeStamp", DateTimeOffset.UtcNow.GetDateString()); json.Add("sleet:operation", "add"); var context = JsonUtility.GetContext("Catalog"); json.Add("@context", context); json.Add("id", packageInput.Identity.Id); json.Add("version", packageInput.Identity.Version.ToFullVersionString()); json.Add("created", now.GetDateString()); json.Add("lastEdited", "0001-01-01T00:00:00Z"); var copyProperties = new List <string>() { "authors", "copyright", "description", "iconUrl", "projectUrl", "licenseUrl", "language", "summary", "owners", "releaseNotes" }; foreach (var propertyName in copyProperties) { json.Add(CreateProperty(propertyName, propertyName, nuspecReader)); } json.Add("isPrerelease", packageInput.Identity.Version.IsPrerelease); // Unused? json.Add("licenseNames", string.Empty); json.Add("licenseReportUrl", string.Empty); // All packages are listed json.Add("listed", true); var titleValue = GetEntry(nuspecReader, "title"); if (!string.IsNullOrEmpty(titleValue)) { json.Add("title", titleValue); } using (var stream = File.OpenRead(packageInput.PackagePath)) { using (var sha512 = SHA512.Create()) { var packageHash = Convert.ToBase64String(sha512.ComputeHash(stream)); json.Add("packageHash", packageHash); json.Add("packageHashAlgorithm", "SHA512"); } json.Add("packageSize", stream.Length); } json.Add("published", now.GetDateString()); json.Add("requireLicenseAcceptance", GetEntry(nuspecReader, "requireLicenseAcceptance").Equals("true", StringComparison.OrdinalIgnoreCase)); var minVersion = nuspecReader.GetMinClientVersion(); if (minVersion != null) { json.Add("minClientVersion", minVersion.ToIdentityString()); } // Tags var tagSet = new HashSet <string>(GetEntry(nuspecReader, "tags").Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries), StringComparer.OrdinalIgnoreCase); tagSet.Remove(string.Empty); var tagArray = new JArray(tagSet); json.Add("tags", tagArray); // Framework assemblies var fwrGroups = nuspecReader.GetFrameworkReferenceGroups(); var fwrArray = new JArray(); json.Add("frameworkAssemblyGroup", fwrArray); foreach (var group in fwrGroups.OrderBy(e => e.TargetFramework.GetShortFolderName(), StringComparer.OrdinalIgnoreCase)) { var groupTFM = group.TargetFramework.GetShortFolderName().ToLowerInvariant(); var groupNode = JsonUtility.Create(rootUri, $"frameworkassemblygroup/{groupTFM}".ToLowerInvariant(), "FrameworkAssemblyGroup"); // Leave the framework property out for the 'any' group if (!group.TargetFramework.IsAny) { groupNode.Add("targetFramework", groupTFM); } fwrArray.Add(groupNode); if (group.Items.Any()) { var assemblyArray = new JArray(); groupNode.Add("assembly", assemblyArray); foreach (var fwAssembly in group.Items.Distinct().OrderBy(e => e, StringComparer.OrdinalIgnoreCase)) { assemblyArray.Add(fwAssembly); } } } // Dependencies var dependencyGroups = nuspecReader.GetDependencyGroups(); var depArray = new JArray(); json.Add("dependencyGroups", depArray); foreach (var group in dependencyGroups.OrderBy(e => e.TargetFramework.GetShortFolderName(), StringComparer.OrdinalIgnoreCase)) { var groupTFM = group.TargetFramework.GetShortFolderName().ToLowerInvariant(); var groupNode = JsonUtility.Create(rootUri, $"dependencygroup/{groupTFM}".ToLowerInvariant(), "PackageDependencyGroup"); // Leave the framework property out for the 'any' group if (!group.TargetFramework.IsAny) { groupNode.Add("targetFramework", groupTFM); } depArray.Add(groupNode); if (group.Packages.Any()) { var packageArray = new JArray(); groupNode.Add("dependencies", packageArray); foreach (var depPackage in group.Packages.Distinct().OrderBy(e => e.Id, StringComparer.OrdinalIgnoreCase)) { var packageNode = JsonUtility.Create(rootUri, $"dependencygroup/{groupTFM}/{depPackage.Id}".ToLowerInvariant(), "PackageDependency"); packageNode.Add("id", depPackage.Id); packageNode.Add("range", depPackage.VersionRange.ToNormalizedString()); packageArray.Add(packageNode); } } } json.Add("packageContent", packageInput.NupkgUri.AbsoluteUri); // add flatcontainer files var packageEntriesArray = new JArray(); json.Add("packageEntries", packageEntriesArray); var packageEntryIndex = 0; foreach (var entry in packageInput.Zip.Entries.OrderBy(e => e.FullName, StringComparer.OrdinalIgnoreCase)) { var fileEntry = JsonUtility.Create(rootUri, $"packageEntry/{packageEntryIndex}", "packageEntry"); fileEntry.Add("fullName", entry.FullName); fileEntry.Add("length", entry.Length); fileEntry.Add("lastWriteTime", entry.LastWriteTime.GetDateString()); packageEntriesArray.Add(fileEntry); packageEntryIndex++; } json.Add("sleet:toolVersion", Constants.SleetVersion.ToFullVersionString()); return(JsonLDTokenComparer.Format(json)); }
protected static FindPackageByIdDependencyInfo GetDependencyInfo(NuspecReader reader) { return(new FindPackageByIdDependencyInfo( reader.GetDependencyGroups(), reader.GetFrameworkReferenceGroups())); }