예제 #1
0
        public IResolutionResult Resolve(PackageManifestRoot rootManifest, IRepository[] activeRepositories, string releaseLabel)
        {
            var resolver = new DependencyResolverImplementation(_writer, rootManifest, activeRepositories, releaseLabel);

            resolver.Resolve();

            return(resolver);
        }
예제 #2
0
        public DependencyResolverImplementation(IWriter writer, PackageManifestRoot rootManifest, IRepository[] activeRepositories, string releaseLabel)
        {
            _cache = new DependencyResolverCache(GetAllAvailableVersions, rootManifest.Framework);

            _writer             = writer;
            _activeRepositories = activeRepositories;

            var version = new VersionRangeExtended(rootManifest.Version)
            {
                ReleaseLabel = releaseLabel
            };

            _rootDependencyNode = new DependencyNode(null, rootManifest.PackageId, rootManifest.Framework.GetShortFolderName(), version);
            _rootDependencyNode.MarkAsRoot(rootManifest);
        }
예제 #3
0
        private void Install(IResolutionResult resolutionResult, PackageManifestRoot manifest, RepositoryScope scope)
        {
            if (scope != RepositoryScope.Cache)
            {
                var cacheRepo = new CacheRepository(_repositoryFactory.TryGetEnabledRepos(RepositoryScope.Cache));
                cacheRepo.PackageDownloadToCacheRepositoryStarted  += CacheRepositoryPackageDownloadToCacheRepositoryStarted;
                cacheRepo.PackageDownloadToCacheRepositoryFinished += CacheRepositoryOnPackageDownloadToCacheRepositoryFinished;

                cacheRepo.DownloadLocally(resolutionResult.ResolutionTable.GetSatisfyingInfos());

                cacheRepo.PackageDownloadToCacheRepositoryStarted  -= CacheRepositoryPackageDownloadToCacheRepositoryStarted;
                cacheRepo.PackageDownloadToCacheRepositoryFinished -= CacheRepositoryOnPackageDownloadToCacheRepositoryFinished;
            }

            using (var installer = _packageInstallerFactory.GetInstaller(_manifestResolver.CurrentDirectory, resolutionResult.ResolutionTable, manifest))
            {
                installer.BeginInstallPackage  += BeginInstallPackage;
                installer.FinishInstallPackage += FinishInstallPackage;

                if (Force)
                {
                    _writer.Text($"Reinstalling {resolutionResult.ResolutionTable.GetPackages().Count()} packages... ");
                    installer.Reinstall(Configuration);
                }
                else
                {
                    var diff = installer.GetDiffWithCurrent(resolutionResult.ResolutionTable.GetSatisfyingInfos()).ToArray();

                    int changed = PrintSuccess(diff);
                    if (changed > 0)
                    {
                        installer.Upgrade(Configuration, diff);
                    }
                    else
                    {
                        _writer.Success("No changes detected");
                    }
                }

                installer.BeginInstallPackage  -= BeginInstallPackage;
                installer.FinishInstallPackage -= FinishInstallPackage;
            }
        }
예제 #4
0
        public void SerializePackageManifestRoot(PackageManifestRoot manifestRoot, Stream stream)
        {
            var xmlManifest = manifestRoot.ToXmlPackageManifestRoot();

            _serializer.Write(xmlManifest, stream);
        }
예제 #5
0
        public bool Execute()
        {
            var assembly = Assembly.GetEntryAssembly();

            var packageId       = "EBerzosa.Pundit";
            var assemblyVersion = assembly.GetName().Version;

            var minVersion = new NuGet.Versioning.NuGetVersion(assemblyVersion.Major, 0, 0);
            var maxVersion = new NuGet.Versioning.NuGetVersion(assemblyVersion.Major + 1, 0, 0);

            var manifest = new PackageManifestRoot
            {
                PackageId    = packageId,
                Framework    = NuGet.Frameworks.NuGetFramework.AgnosticFramework,
                Version      = new NuGet.Versioning.NuGetVersion(1, 0, 0, 0),
                Dependencies =
                {
                    new PackageDependency(packageId, new NuGet.Versioning.VersionRange(minVersion, true, maxVersion))
                    {
                        Scope = DependencyScope.Normal
                    }
                }
            };

            manifest.Validate();

            _writer.BeginWrite().Text("Getting repositories...");

            var scope = CacheReposOnly ? RepositoryScope.Cache : RepositoryScope.Any;

            var repos = _repositoryFactory.TryGetEnabledRepos(scope).ToArray();

            if (repos.Length == 0)
            {
                _writer.Error(" no available repos").EndWrite();
                return(false);
            }

            _writer.Text(" using repos:").EndWrite();
            foreach (var repository in repos)
            {
                _writer.Info(repository.ToString());
            }

            _writer.BeginWrite().Text("Resolving...");
            var resolutionResult = _dependencyResolver.Resolve(manifest, repos, null);

            if (resolutionResult.ResolutionTable.HasConflicts)
            {
                _writer.Error(" failed").EndWrite()
                .Empty()
                .BeginWrite().Error("Could not resolve manifest due to conflicts...").EndWrite();

                PrintConflicts(_dependencyResolver, resolutionResult);

                return(false);
            }

            _writer.Success(" ok").EndWrite();

            if (DryRun)
            {
                return(true);
            }

            var currentPath = Path.GetDirectoryName(assembly.Location);

            if (!Install(resolutionResult, manifest, currentPath, out var oldVersion))
            {
                return(true);
            }

            var oldPath    = Path.Combine(currentPath, "old", DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss") + "_" + oldVersion);
            var updatePath = Path.Combine(currentPath, "lib");

            if (Directory.Exists(oldPath))
            {
                foreach (var file in Directory.EnumerateFiles(oldPath))
                {
                    File.Delete(file);
                }
            }
            else
            {
                Directory.CreateDirectory(oldPath);
            }

            foreach (var originalFile in Directory.EnumerateFiles(currentPath))
            {
                if (Path.GetFileNameWithoutExtension(originalFile) == string.Empty)
                {
                    continue;
                }

                File.Move(originalFile, Path.Combine(oldPath, Path.GetFileName(originalFile)));
            }

            foreach (var newFile in Directory.EnumerateFiles(updatePath))
            {
                File.Move(newFile, Path.Combine(currentPath, Path.GetFileName(newFile)));
            }

            Directory.Delete(updatePath, false);

            return(true);
        }
예제 #6
0
 public static XmlPackageManifestRoot ToXmlPackageManifestRoot(this PackageManifestRoot packageManifestRoot)
 {
     return(packageManifestRoot.Adapt <XmlPackageManifestRoot>());
 }