Пример #1
0
        protected virtual void AddFileCore(string path, Action addFileAction)
        {
            if (string.IsNullOrEmpty(path))
            {
                return;
            }

            bool fileExistsInProject = FileExistsInProject(path);

            string fileName = Path.GetFileName(path);

            string lockFileFullPath = PackagesConfigLockFileUtility.GetPackagesLockFilePath(ProjectFullPath, GetPropertyValue("NuGetLockFilePath")?.ToString(), ProjectName);

            if (File.Exists(Path.Combine(ProjectFullPath, path)) &&
                !fileExistsInProject &&
                !fileName.Equals(Constants.PackageReferenceFile) &&
                !fileName.Equals("packages." + ProjectName + ".config") &&
                !fileName.Equals("web.config") &&
                !fileName.Equals("app.config") &&
                !fileName.Equals(Path.GetFileName(lockFileFullPath)))
            {
                NuGetProjectContext.Log(MessageLevel.Warning, "File already exists", path);
                return;
            }

            addFileAction?.Invoke();

            if (!fileExistsInProject)
            {
                AddFileToProject(path);
            }
        }
Пример #2
0
        private void ValidatePackagesConfigLockFiles(IEnumerable <NuGetProject> allProjects, CancellationToken token)
        {
            var pcProjects = allProjects.Where(p => p.ProjectStyle == ProjectModel.ProjectStyle.PackagesConfig);

            foreach (MSBuildNuGetProject project in pcProjects)
            {
                string projectFile  = project.MSBuildProjectPath;
                string pcFile       = project.PackagesConfigNuGetProject.FullPath;
                var    projectName  = (string)project.GetMetadataOrNull("Name");
                var    lockFileName = (string)project.GetMetadataOrNull("NuGetLockFilePath");
                var    restorePackagesWithLockFile = (string)project.GetMetadataOrNull("RestorePackagesWithLockFile");
                var    projectTfm        = (NuGetFramework)project.GetMetadataOrNull("TargetFramework");
                bool   restoreLockedMode = MSBuildStringUtility.GetBooleanOrNull((string)project.GetMetadataOrNull("LockedMode")) ?? false;

                IReadOnlyList <IRestoreLogMessage> validationLogs = PackagesConfigLockFileUtility.ValidatePackagesConfigLockFiles(
                    projectFile,
                    pcFile,
                    projectName,
                    lockFileName,
                    restorePackagesWithLockFile,
                    projectTfm,
                    project.FolderNuGetProject.Root,
                    restoreLockedMode,
                    token);

                if (validationLogs != null)
                {
                    foreach (var logItem in validationLogs)
                    {
                        _logger.Log(logItem);
                    }
                }
            }
        }
Пример #3
0
        public void ApplyChanges_AddInstalledPackage()
        {
            // Arrange
            var lockFile = new PackagesLockFile
            {
                Targets = new List <PackagesLockFileTarget>
                {
                    new PackagesLockFileTarget()
                }
            };

            var actionList = new List <NuGetProjectAction>
            {
                NuGetProjectAction.CreateInstallProjectAction(new PackageIdentity("packageA", NuGetVersion.Parse("1.0.0")), null, null)
            };

            var contentHashUtility = new Mock <IPackagesConfigContentHashProvider>();

            // Act
            PackagesConfigLockFileUtility.ApplyChanges(lockFile, actionList, contentHashUtility.Object, CancellationToken.None);

            // Assert
            Assert.Equal(1, lockFile.Targets[0].Dependencies.Count);
            Assert.Equal(actionList[0].PackageIdentity.Id, lockFile.Targets[0].Dependencies[0].Id);
            Assert.Equal(actionList[0].PackageIdentity.Version, lockFile.Targets[0].Dependencies[0].ResolvedVersion);
        }
Пример #4
0
        private void ValidatePackagesConfigLockFiles(IReadOnlyList <string> packagesConfigFiles, IReadOnlyList <PackageSpec> projects, string packagesFolderPath, List <RestoreSummary> restoreSummaries)
        {
            foreach (var pcFile in packagesConfigFiles)
            {
                var dgSpec = projects?.FirstOrDefault(p =>
                {
                    if (p.RestoreMetadata is PackagesConfigProjectRestoreMetadata pcRestoreMetadata)
                    {
                        return(StringComparer.OrdinalIgnoreCase.Equals(pcRestoreMetadata.PackagesConfigPath, pcFile));
                    }
                    return(false);
                });

                var projectFile       = dgSpec?.FilePath ?? pcFile;
                var projectTfm        = dgSpec?.TargetFrameworks.SingleOrDefault()?.FrameworkName ?? NuGetFramework.AnyFramework;
                var restoreLockedMode = LockedMode || (dgSpec?.RestoreMetadata?.RestoreLockProperties?.RestoreLockedMode ?? false);
                var lockFilePath      = LockFilePath ?? dgSpec?.RestoreMetadata?.RestoreLockProperties?.NuGetLockFilePath;
                var useLockFile       = UseLockFile ? bool.TrueString : dgSpec?.RestoreMetadata?.RestoreLockProperties?.RestorePackagesWithLockFile;

                IReadOnlyList <IRestoreLogMessage> result = PackagesConfigLockFileUtility.ValidatePackagesConfigLockFiles(
                    projectFile,
                    pcFile,
                    dgSpec?.Name,
                    lockFilePath,
                    useLockFile,
                    projectTfm,
                    packagesFolderPath,
                    restoreLockedMode,
                    CancellationToken.None);

                if (result != null)
                {
                    restoreSummaries.Add(new RestoreSummary(
                                             success: false,
                                             inputPath: projectFile,
                                             configFiles: Array.Empty <string>(),
                                             feedsUsed: Array.Empty <string>(),
                                             installCount: 0,
                                             errors: result));
                }
            }
        }
Пример #5
0
        public void ApplyChanges_SortPackages_LastPackage()
        {
            // Arrange
            var lockFile = new PackagesLockFile
            {
                Targets = new List <PackagesLockFileTarget>
                {
                    new PackagesLockFileTarget
                    {
                        Dependencies = new List <LockFileDependency>
                        {
                            new LockFileDependency
                            {
                                Id = "packageB",
                                ResolvedVersion = NuGetVersion.Parse("1.0.0")
                            },
                            new LockFileDependency
                            {
                                Id = "packageD",
                                ResolvedVersion = NuGetVersion.Parse("1.0.0")
                            }
                        }
                    }
                }
            };

            var actionList = new List <NuGetProjectAction>
            {
                NuGetProjectAction.CreateInstallProjectAction(new PackageIdentity("packageE", NuGetVersion.Parse("1.0.0")), null, null)
            };

            var contentHashUtility = new Mock <IPackagesConfigContentHashProvider>();

            // Act
            PackagesConfigLockFileUtility.ApplyChanges(lockFile, actionList, contentHashUtility.Object, CancellationToken.None);

            // Assert
            Assert.Equal(3, lockFile.Targets[0].Dependencies.Count);
            Assert.Equal("packageB", lockFile.Targets[0].Dependencies[0].Id);
            Assert.Equal("packageD", lockFile.Targets[0].Dependencies[1].Id);
            Assert.Equal("packageE", lockFile.Targets[0].Dependencies[2].Id);
        }
Пример #6
0
        public void GetPackagesLockFilePath_PackagesLockJson()
        {
            // Arrange
            var projectName = "testproj";
            var logger      = new TestLogger();

            using (var rootFolder = TestDirectory.Create())
            {
                var projectFolder   = new DirectoryInfo(Path.Combine(rootFolder, projectName));
                var targetFramework = NuGetFramework.Parse("net46");

                var msBuildNuGetProjectSystem = new TestMSBuildNuGetProjectSystem(targetFramework, new TestNuGetProjectContext(), projectFolder.FullName);
                var project = new TestMSBuildNuGetProject(msBuildNuGetProjectSystem, rootFolder, projectFolder.FullName);

                // Act
                var lockFile = PackagesConfigLockFileUtility.GetPackagesLockFilePath(project);

                // Assert
                Assert.Equal(Path.Combine(projectFolder.FullName, "packages.lock.json"), lockFile);
            }
        }
Пример #7
0
        private Task AddFileCoreAsync(string path, Action addFile)
        {
            // Do not try to add file to project, if the path is null or empty.
            if (string.IsNullOrEmpty(path))
            {
                return(Task.FromResult(false));
            }

            var fileExistsInProject = FileExistsInProject(path);

            // If the file exists on disk but not in the project then skip it.
            // One exception is the 'packages.config' file, in which case we want to include
            // it into the project.
            // Other exceptions are 'web.config' and 'app.config'
            var fileName         = Path.GetFileName(path);
            var lockFileFullPath = PackagesConfigLockFileUtility.GetPackagesLockFilePath(ProjectFullPath, GetPropertyValue("NuGetLockFilePath")?.ToString(), ProjectName);

            if (File.Exists(Path.Combine(ProjectFullPath, path)) &&
                !fileExistsInProject &&
                !fileName.Equals(ProjectManagement.Constants.PackageReferenceFile) &&
                !fileName.Equals("packages." + ProjectName + ".config") &&
                !fileName.Equals(EnvDTEProjectInfoUtility.WebConfig) &&
                !fileName.Equals(EnvDTEProjectInfoUtility.AppConfig) &&
                !fileName.Equals(Path.GetFileName(lockFileFullPath))
                )
            {
                NuGetProjectContext.Log(ProjectManagement.MessageLevel.Warning, Strings.Warning_FileAlreadyExists, path);
            }
            else
            {
                EnvDTEProjectUtility.EnsureCheckedOutIfExists(VsProjectAdapter.Project, ProjectFullPath, path);
                addFile();
                if (!fileExistsInProject)
                {
                    return(AddFileToProjectAsync(path));
                }
            }

            return(Task.FromResult(false));
        }
Пример #8
0
        public void GetPackagesLockFilePath_MsbuildProperty()
        {
            // Arrage
            var projectName = "testproj";
            var logger      = new TestLogger();
            var expected    = "somewhere\\my.lock.json";

            using (var rootFolder = TestDirectory.Create())
            {
                var projectFolder   = new DirectoryInfo(Path.Combine(rootFolder, projectName));
                var targetFramework = NuGetFramework.Parse("net46");

                var msBuildNuGetProjectSystem = new TestMSBuildNuGetProjectSystem(targetFramework, new TestNuGetProjectContext(), projectFolder.FullName);
                var project = new TestMSBuildNuGetProject(msBuildNuGetProjectSystem, rootFolder, projectFolder.FullName);
                msBuildNuGetProjectSystem.SetPropertyValue("NuGetLockFilePath", expected);

                // Act
                var lockFile = PackagesConfigLockFileUtility.GetPackagesLockFilePath(project);

                // Assert
                Assert.Equal(Path.Combine(projectFolder.FullName, expected), lockFile);
            }
        }