コード例 #1
0
        public void PackagesConfigWriter_UpdateAttributesFromOriginalConfig()
        {
            // Arrange
            using (var stream = new MemoryStream())
                using (var stream2 = new MemoryStream())
                {
                    // Act
                    using (var writer = new PackagesConfigWriter(stream, true))
                    {
                        var vensionRange      = new VersionRange(NuGetVersion.Parse("0.5.0"));
                        var packageIdentityA  = new PackageIdentity("packageA", NuGetVersion.Parse("1.0.1"));
                        var packageReferenceA = new PackageReference(packageIdentityA, NuGetFramework.Parse("net45"),
                                                                     userInstalled: false, developmentDependency: false, requireReinstallation: true, allowedVersions: vensionRange);

                        writer.AddPackageEntry(packageReferenceA);
                    }

                    stream.Seek(0, SeekOrigin.Begin);
                    var xml = XDocument.Load(stream);

                    var packageIdentityB  = new PackageIdentity("packageA", NuGetVersion.Parse("3.0.1"));
                    var packageReferenceB = new PackageReference(packageIdentityB, NuGetFramework.Parse("dnxcore50"),
                                                                 userInstalled: false, developmentDependency: false, requireReinstallation: false);

                    using (var writer = new PackagesConfigWriter(stream2, true))
                    {
                        writer.UpdateOrAddPackageEntry(xml, packageReferenceB);
                    }

                    stream2.Seek(0, SeekOrigin.Begin);
                    var xml2   = XDocument.Load(stream2);
                    var reader = new PackagesConfigReader(xml2);

                    // Assert

                    var packages = reader.GetPackages().ToArray();
                    Assert.Equal("1", packages.Count().ToString());
                    Assert.Equal("packageA", packages[0].PackageIdentity.Id);
                    Assert.Equal("3.0.1", packages[0].PackageIdentity.Version.ToNormalizedString());
                    Assert.Equal("dnxcore50", packages[0].TargetFramework.GetShortFolderName());

                    // Verify allowedVersions attribute is kept after package update.
                    Assert.Equal("[0.5.0, )", packages[0].AllowedVersions.ToNormalizedString());

                    // Verify that RequireReinstallation attribute is removed after package upate.
                    Assert.Equal("False", packages[0].RequireReinstallation.ToString());
                }
        }
コード例 #2
0
        public override async Task <bool> InstallPackageAsync(
            PackageIdentity packageIdentity,
            DownloadResourceResult downloadResourceResult,
            INuGetProjectContext nuGetProjectContext,
            CancellationToken token)
        {
            if (packageIdentity == null)
            {
                throw new ArgumentNullException("packageIdentity");
            }

            if (nuGetProjectContext == null)
            {
                throw new ArgumentNullException("nuGetProjectContext");
            }

            var isDevelopmentDependency = await CheckDevelopmentDependencyAsync(downloadResourceResult, token);

            var newPackageReference = new PackageReference(
                packageIdentity,
                TargetFramework,
                userInstalled: true,
                developmentDependency: isDevelopmentDependency,
                requireReinstallation: false);
            var installedPackagesList = GetInstalledPackagesList();

            try
            {
                // Avoid modifying the packages.config file while it is being read
                // This can happen when VS API calls are made to get the list of
                // all installed packages.
                lock (_configLock)
                {
                    // Packages.config exist at full path
                    if (installedPackagesList.Any())
                    {
                        var packageReferenceWithSameId = installedPackagesList.FirstOrDefault(
                            p => p.PackageIdentity.Id.Equals(packageIdentity.Id, StringComparison.OrdinalIgnoreCase));

                        if (packageReferenceWithSameId != null)
                        {
                            if (packageReferenceWithSameId.PackageIdentity.Equals(packageIdentity))
                            {
                                nuGetProjectContext.Log(MessageLevel.Warning, Strings.PackageAlreadyExistsInPackagesConfig, packageIdentity, Path.GetFileName(FullPath));
                                return(false);
                            }

                            // Higher version of an installed package is being installed. Remove old and add new
                            using (var writer = new PackagesConfigWriter(FullPath, createNew: false))
                            {
                                writer.UpdatePackageEntry(packageReferenceWithSameId, newPackageReference);
                            }
                        }
                        else
                        {
                            using (var writer = new PackagesConfigWriter(FullPath, createNew: false))
                            {
                                if (nuGetProjectContext.OriginalPackagesConfig == null)
                                {
                                    // Write a new entry
                                    writer.AddPackageEntry(newPackageReference);
                                }
                                else
                                {
                                    // Update the entry based on the original entry if it exists
                                    writer.UpdateOrAddPackageEntry(nuGetProjectContext.OriginalPackagesConfig, newPackageReference);
                                }
                            }
                        }
                    }
                    // Create new packages.config file and add the package entry
                    else
                    {
                        using (var writer = new PackagesConfigWriter(FullPath, createNew: true))
                        {
                            if (nuGetProjectContext.OriginalPackagesConfig == null)
                            {
                                // Write a new entry
                                writer.AddPackageEntry(newPackageReference);
                            }
                            else
                            {
                                // Update the entry based on the original entry if it exists
                                writer.UpdateOrAddPackageEntry(nuGetProjectContext.OriginalPackagesConfig, newPackageReference);
                            }
                        }
                    }
                }
            }
            catch (PackagesConfigWriterException ex)
            {
                throw new InvalidOperationException(string.Format(
                                                        CultureInfo.CurrentCulture,
                                                        Strings.ErrorWritingPackagesConfig,
                                                        FullPath,
                                                        ex.Message));
            }

            nuGetProjectContext.Log(MessageLevel.Info, Strings.AddedPackageToPackagesConfig, packageIdentity, Path.GetFileName(FullPath));
            return(true);
        }