コード例 #1
0
        public static IEnumerable <FolderProjectItem> GetMatchingTargets(SolutionTool solutionTool, FolderTool folderTool, ILogger logger)
        {
            var matchingTargets      = new List <FolderProjectItem>();
            var projects             = solutionTool.GetProjectsWithParents().ToArray();
            var targetProjects       = folderTool.GetProjects();
            var targetProjectsLookup = targetProjects.ToDictionary(p => p.Name, p => p);

            foreach (var project in projects)
            {
                if (solutionTool.CompilableProjects.Contains(project.Type))
                {
                    var projectPath = PathExtensions.GetAbsolutePath(solutionTool.FolderPath, project.Path);

                    var projectTool = new ProjectTool(projectPath, logger);
                    foreach (var reference in projectTool.GetReferences())
                    {
                        if (targetProjectsLookup.ContainsKey(reference.Name))
                        {
                            var matchingProject = targetProjectsLookup[reference.Name];

                            var nugetPackagesConfigPath = PathExtensions.GetAbsolutePath(projectTool.FolderPath, "packages.config");

                            if (System.IO.File.Exists(nugetPackagesConfigPath))
                            {
                                var nugetTool = new NugetTool(nugetPackagesConfigPath);

                                var packages = nugetTool.GetNugetPackages();

                                var referencePackage = packages.FirstOrDefault(pkg => pkg.Name == reference.Name);

                                if (referencePackage != null)
                                {
                                    if (!matchingTargets.Contains(matchingProject))
                                    {
                                        matchingTargets.Add(matchingProject);
                                    }
                                }
                            }
                        }
                    }
                }
            }

            return(matchingTargets);
        }
コード例 #2
0
        public void TransmogrifyNugetPackagesToProjects(SolutionTool solutionTool, FolderTool folderTool)
        {
            UpdateSolutionWithFolderTargets(solutionTool, folderTool);

            var projects       = solutionTool.GetProjectsWithParents().ToArray();
            var projectsLookup = projects.Where(p => solutionTool.CompilableProjects.Contains(p.Type)).ToDictionary(p => p.Name, p => p);

            foreach (var project in projects)
            {
                if (solutionTool.CompilableProjects.Contains(project.Type))
                {
                    var projectPath = PathExtensions.GetAbsolutePath(solutionTool.FolderPath, project.Path);

                    var projectTool = new ProjectTool(projectPath, _logger);

                    if (projectTool.IsCpsDocument)
                    {
                        foreach (var packageReference in projectTool.GetPackageReferences().ToArray())
                        {
                            if (projectsLookup.ContainsKey(packageReference.Name))
                            {
                                var matchingProject = projectsLookup[packageReference.Name];

                                projectTool.RemovePackageReference(packageReference.Name);
                                _logger.LogInformation($"Removed NuGet {packageReference.Name} from {project.Name}");

                                var absolutePath = PathExtensions.GetAbsolutePath(solutionTool.FolderPath, matchingProject.Path);
                                var relativePath = PathExtensions.MakeRelativePath(projectTool.FolderPath, absolutePath);
                                projectTool.AddProjectReference(matchingProject.Name, relativePath, matchingProject.Id);
                                _logger.LogInformation($"Added ProjectReference {matchingProject.Name} from {relativePath}");

                                var nugetPackageTool = new NugetPackageTool(solutionTool.FolderPath, packageReference.Name, packageReference.Version, packageReference.TargetFramework);
                                var nuspec           = nugetPackageTool.GetNuspec();

                                foreach (var dependency in nuspec.Dependencies)
                                {
                                    if (projectsLookup.ContainsKey(dependency.Name))
                                    {
                                        matchingProject = projectsLookup[dependency.Name];
                                        absolutePath    = PathExtensions.GetAbsolutePath(solutionTool.FolderPath, matchingProject.Path);
                                        relativePath    = PathExtensions.MakeRelativePath(projectTool.FolderPath, absolutePath);
                                        projectTool.AddProjectReference(matchingProject.Name, relativePath, matchingProject.Id);
                                        _logger.LogInformation($"Added ProjectReference {matchingProject.Name} from {relativePath} for dependency from nuspec");
                                    }
                                    else
                                    {
                                        projectTool.AddNugetReference(dependency.Name, dependency.Version, null);
                                    }
                                    _logger.LogProgress();
                                }
                            }
                            _logger.LogProgress();
                        }
                    }
                    else
                    {
                        foreach (var reference in projectTool.GetReferences().ToArray())
                        {
                            if (projectsLookup.ContainsKey(reference.Name))
                            {
                                var matchingProject = projectsLookup[reference.Name];

                                var packages         = projectTool.GetPackageReferences().ToArray();
                                var referencePackage = packages.FirstOrDefault(pkg => pkg.Name == reference.Name);

                                if (referencePackage != null)
                                {
                                    projectTool.RemovePackageReference(referencePackage.Name);
                                    _logger.LogInformation($"Removed NuGet {referencePackage.Name} from packages.config");

                                    projectTool.RemoveReference(reference.Name);
                                    _logger.LogInformation($"Removed Reference {reference.Name} from {projectTool.FilePath}");

                                    var absolutePath = PathExtensions.GetAbsolutePath(solutionTool.FolderPath, matchingProject.Path);
                                    var relativePath = PathExtensions.MakeRelativePath(projectTool.FolderPath, absolutePath);
                                    projectTool.AddProjectReference(matchingProject.Name, relativePath, matchingProject.Id);
                                    _logger.LogInformation($"Added ProjectReference {matchingProject.Name} from {relativePath}");

                                    var nugetPackageTool =
                                        new NugetPackageTool(solutionTool.FolderPath, referencePackage.Name, referencePackage.Version, referencePackage.TargetFramework);
                                    var nuspec = nugetPackageTool.GetNuspec();

                                    foreach (var dependency in nuspec.Dependencies)
                                    {
                                        if (projectsLookup.ContainsKey(dependency.Name))
                                        {
                                            matchingProject = projectsLookup[dependency.Name];
                                            absolutePath    = PathExtensions.GetAbsolutePath(solutionTool.FolderPath, matchingProject.Path);
                                            relativePath    = PathExtensions.MakeRelativePath(projectTool.FolderPath, absolutePath);
                                            projectTool.AddProjectReference(matchingProject.Name, relativePath, matchingProject.Id);
                                            _logger.LogInformation($"Added ProjectReference {matchingProject.Name} from {relativePath} for dependency from nuspec");
                                        }
                                        else
                                        {
                                            var existingReference = packages.FirstOrDefault(pkg => pkg.Name == dependency.Name);
                                            if (existingReference == null)
                                            {
                                                projectTool.AddNugetReference(dependency.Name, dependency.Version, projectTool.GetTargetFramework());
                                            }
                                        }
                                        _logger.LogProgress();
                                    }
                                }
                            }
                            _logger.LogProgress();
                        }
                    }

                    projectTool.Save();
                }
                _logger.LogProgress();
            }
        }