コード例 #1
0
        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()
                ));
 }
コード例 #3
0
 /// <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()
                ));
 }
コード例 #4
0
        /// <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()));
        }
コード例 #5
0
        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" });
                }
            }
        }
コード例 #6
0
        /// <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()));
        }
コード例 #7
0
        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));
        }
コード例 #8
0
        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]);
        }
コード例 #9
0
        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"));
            }
        }
コード例 #10
0
 /// <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);
             }
         }
     }
 }
コード例 #11
0
        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;
        }
コード例 #12
0
        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);
        }
コード例 #13
0
        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
                        }
                    });
                }
            }
        }
コード例 #14
0
        /// <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));
        }
コード例 #15
0
 protected static FindPackageByIdDependencyInfo GetDependencyInfo(NuspecReader reader)
 {
     return(new FindPackageByIdDependencyInfo(
                reader.GetDependencyGroups(),
                reader.GetFrameworkReferenceGroups()));
 }