Exemplo n.º 1
0
        public bool Resolve()
        {
            if (_resolvedManifestPath == null)
            {
                _resolvedManifestPath = _manifestResolver.GetManifest(ManifestFileOrPath);
            }

            PrintSettings();

            _writer.BeginWrite().Text("Reading manifest...");

            PackageManifestRoot manifest;

            using (Stream stream = File.OpenRead(_resolvedManifestPath))
            {
                manifest = _packageSerializer.DeserializePackageManifestRoot(stream);
                manifest.Validate();
            }

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

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

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

            var repos = Repository == null
            ? _repositoryFactory.TryGetEnabledRepos(scope).ToArray()
            : new[] { _repositoryFactory.GetCustomRepository(Repository) };

            if (repos.Length == 0 || repos[0] == null)
            {
                _writer.Error(" no available repos");
                return(false);
            }

            _writer.EndWrite();

            foreach (var repository in repos)
            {
                _writer.Info("  " + repository);
            }

            _writer.EndWrite();

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

            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)
            {
                var packageIds = new List <string>();
                var versions   = new List <string>();
                var platforms  = new List <string>();
                var inRepo     = new List <string>();
                foreach (var infos in resolutionResult.ResolutionTable.GetSatisfyingInfos())
                {
                    packageIds.Add(infos.PackageId);
                    versions.Add(infos.Version.ToString());
                    platforms.Add(infos.Framework);
                    inRepo.Add(infos.Repo.Name);
                }

                _writer.Title("Resolved packages")
                .BeginColumns(new int?[] { packageIds.Max(p => p.Length + 2), versions.Max(v => v.Length + 2), platforms.Max(p => (p?.Length ?? 0) + 2), null });

                _writer.Header("PackageId").Header("Version").Header("Fmwk").Header("Repository");

                for (int i = 0; i < packageIds.Count; i++)
                {
                    _writer.Text(packageIds[i]).Text(versions[i]).Text(platforms[i]).Text(inRepo[i]);
                }

                _writer.EndColumns();

                return(true);
            }

            Install(resolutionResult, manifest, scope);

            return(true);
        }
Exemplo n.º 2
0
        public void Pack()
        {
            _packageSpecFile = _manifestResolver.GetManifest(ManifestFileOrPath);

            var solutionDirectory = Path.GetDirectoryName(_packageSpecFile);

            _resolvedOutputPath = OutputPath == null || !Path.IsPathRooted(OutputPath)
            ? Path.Combine(_manifestResolver.CurrentDirectory, OutputPath ?? solutionDirectory)
            : OutputPath;

            if (!Directory.Exists(_resolvedOutputPath))
            {
                throw new DirectoryNotFoundException($"Destination directory '{_resolvedOutputPath}' does not exist");
            }

            _writer.BeginColumns(new int?[] { 15, null })
            .Text("Package Spec:").Text(_packageSpecFile)
            .Text("Solution Root:").Text(solutionDirectory)
            .Text("Output Dir:").Text(_resolvedOutputPath)
            .EndColumns().Empty();

            PackageSpec packageSpec;

            using (Stream packageSpecStream = File.OpenRead(_packageSpecFile))
            {
                packageSpec = _packageSerializer.DeserializePackageSpec(packageSpecStream);
                packageSpec.Validate();
            }

            if (Version != null)
            {
                _writer.Info($"Overriding package version '{packageSpec.Version}' from spec with '{Version}'");
                packageSpec.Version = NuGet.Versioning.NuGetVersion.Parse(Version);
            }

            if (ReleaseLabel != null)
            {
                packageSpec.Version = packageSpec.Version.Append(ReleaseLabel).RevisionToLabel();
            }

            if (!string.IsNullOrEmpty(packageSpec.Version.Release))
            {
                packageSpec.Version = packageSpec.Version.RevisionToLabel();
            }

            var packageName = Type == PackType.NuGet
            ? new NuGet.Packaging.VersionFolderPathResolver(null).GetPackageFileName(packageSpec.PackageId, packageSpec.Version)
            : packageSpec.GetNewManifestFileName();

            DestinationFile = Path.Combine(_resolvedOutputPath, packageName);

            if (File.Exists(DestinationFile))
            {
                _writer.Warning($"Package '{packageName}' already exists, it will be overwritted");
            }

            _writer.Text($"Creating package '{packageName}', {packageSpec}...");

            long bytesWritten;

            using (Stream writeStream = File.Create(DestinationFile))
                using (var packageWriter = GetWriter(solutionDirectory, packageSpec, writeStream))
                {
                    packageWriter.OnBeginPackingFile = p => _writer.EndWrite().BeginWrite().Text("Packing ").Success(p.FileName).Text("... ");
                    packageWriter.OnEndPackingFile   = p => _writer.Success("ok").EndWrite();

                    bytesWritten = packageWriter.WriteAll();
                }

            var packageSize = new FileInfo(DestinationFile).Length;

            var written = PathUtils.FileSizeToString(bytesWritten);
            var packed  = PathUtils.FileSizeToString(packageSize);
            var ratio   = bytesWritten == 0 ? 100 : packageSize * 100 / bytesWritten;

            _writer.Text($"Packed {written} to {packed} (ratio: {ratio:D2}%)");
        }