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()); } }
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); }