예제 #1
0
        public static string GetVersion(
            string version,
            bool isReleaseBuild,
            string suffix,
            bool enableBuildNumber,
            string packageBuildMetadata,
            ILogger logger,
            NuGetVersioningSettings nugetVersioningSettings)
        {
            Version parsedVersion;

            if (!Version.TryParse(version, out parsedVersion))
            {
                throw new ArgumentException($"The version '{version} is not a valid version format");
            }

            if (isReleaseBuild)
            {
                string parsed = parsedVersion.ToString(3);

                logger.Write($"Build is release build, using major.minor.patch as the version, {parsed}");

                return(parsed);
            }

            string buildVersion;

            int usePadding =
                nugetVersioningSettings.SemVerVersion == 1 && nugetVersioningSettings.MaxZeroPaddingLength > 0
                    ? nugetVersioningSettings.MaxZeroPaddingLength
                    : 0;

            string semVer2PreReleaseSeparator = nugetVersioningSettings.SemVerVersion == 2 ? "." : string.Empty;

            if (!string.IsNullOrWhiteSpace(suffix))
            {
                if (enableBuildNumber)
                {
                    buildVersion =
                        $"{parsedVersion.Major}.{parsedVersion.Minor}.{parsedVersion.Build}-{suffix}{semVer2PreReleaseSeparator}{parsedVersion.Revision.ToString().LeftPad(usePadding, '0')}";

                    logger.Write(
                        $"Package suffix is {suffix}, using major.minor.patch-{{suffix}}build as the version, {buildVersion}");
                }
                else
                {
                    buildVersion = $"{parsedVersion.Major}.{parsedVersion.Minor}.{parsedVersion.Build}-{suffix}";

                    logger.Write(
                        $"Package suffix is {suffix}, using major.minor.patch-{{suffix}} as the version, {buildVersion}");
                }
            }
            else
            {
                if (enableBuildNumber)
                {
                    buildVersion =
                        $"{parsedVersion.Major}.{parsedVersion.Minor}.{parsedVersion.Build}-{parsedVersion.Revision.ToString().LeftPad(usePadding, '0')}";

                    logger.Write($"Using major.minor.patch-build as the version, {buildVersion}");
                }
                else
                {
                    buildVersion = $"{parsedVersion.Major}.{parsedVersion.Minor}.{parsedVersion.Build}";
                    logger.Write($"Using major.minor.patch as the version, {buildVersion}");
                }
            }

            string final;

            if (!string.IsNullOrWhiteSpace(packageBuildMetadata))
            {
                final = $"{buildVersion}+{packageBuildMetadata.TrimStart('+')}";
            }
            else
            {
                final = buildVersion;
            }

            SemanticVersion semanticVersion;

            if (!SemanticVersion.TryParse(final, out semanticVersion))
            {
                throw new InvalidOperationException($"The NuGet version '{final}' is not a valid Semver 2.0 version");
            }

            return(final);
        }
예제 #2
0
        public async Task <ExitCode> CreatePackageAsync(
            string packageSpecificationPath,
            NuGetPackageConfiguration packageConfiguration,
            bool ignoreWarnings = false,
            CancellationToken cancellationToken = default)
        {
            _logger.WriteDebug($"Using NuGet package configuration {packageConfiguration}");

            NuSpec nuSpec = NuSpec.Parse(packageSpecificationPath);

            string properties = GetProperties(packageConfiguration.Configuration);

            if (!string.IsNullOrWhiteSpace(packageConfiguration.PackageIdOverride))
            {
                _logger.Write($"Using NuGet package id override '{packageConfiguration.PackageIdOverride}'");
            }

            string packageId = !string.IsNullOrWhiteSpace(packageConfiguration.PackageIdOverride)
                ? packageConfiguration.PackageIdOverride
                : NuGetPackageIdHelper.CreateNugetPackageId(
                nuSpec.PackageId,
                packageConfiguration.IsReleaseBuild,
                packageConfiguration.BranchName,
                packageConfiguration.BranchNameEnabled);

            if (string.IsNullOrWhiteSpace(packageConfiguration.PackageIdOverride))
            {
                _logger.Write($"Using NuGet package ID {packageId}");
            }
            else
            {
                _logger.Write($"Using NuGet package version override '{packageConfiguration.PackageIdOverride}'");
            }

            var nuGetVersioningSettings = new NuGetVersioningSettings {
                MaxZeroPaddingLength = 5, SemVerVersion = 1
            };
            string nuGetPackageVersion = !string.IsNullOrWhiteSpace(packageConfiguration.NuGetPackageVersionOverride)
                ? packageConfiguration.NuGetPackageVersionOverride
                : NuGetVersionHelper.GetVersion(
                packageConfiguration.Version,
                packageConfiguration.IsReleaseBuild,
                packageConfiguration.Suffix,
                packageConfiguration.BuildNumberEnabled,
                packageConfiguration.PackageBuildMetadata,
                _logger,
                nuGetVersioningSettings);

            _logger.Write(
                string.IsNullOrWhiteSpace(packageConfiguration.NuGetPackageVersionOverride)
                    ? $"Using NuGet package version {nuGetPackageVersion}"
                    : $"Using NuGet package version override '{packageConfiguration.NuGetPackageVersionOverride}'");

            var nuSpecInfo = new FileInfo(packageSpecificationPath);

            // ReSharper disable AssignNullToNotNullAttribute
            string nuSpecFileCopyPath = Path.Combine(nuSpecInfo.DirectoryName, $"{Guid.NewGuid()}-{nuSpecInfo.Name}");

            // ReSharper restore AssignNullToNotNullAttribute

            var nuSpecCopy = new NuSpec(packageId, nuGetPackageVersion, nuSpecInfo.FullName);

            string nuSpecTempDirectory = Path.Combine(packageConfiguration.TempPath, "nuspecs");

            if (!Directory.Exists(nuSpecTempDirectory))
            {
                Directory.CreateDirectory(nuSpecTempDirectory);
            }

            _logger.WriteVerbose($"Saving new nuspec '{nuSpecFileCopyPath}'");
            nuSpecCopy.Save(nuSpecFileCopyPath);

            var removedTags = new List <string>();

            if (packageConfiguration.AllowManifestReWrite)
            {
                _logger.WriteVerbose($"Rewriting manifest in NuSpec '{nuSpecFileCopyPath}'");

                var manitestReWriter = new ManitestReWriter();
                ManifestReWriteResult manifestReWriteResult = manitestReWriter.Rewrite(nuSpecFileCopyPath);

                removedTags.AddRange(manifestReWriteResult.RemoveTags);
            }
            else
            {
                _logger.WriteVerbose("Rewriting manifest disabled");
            }

            _logger.WriteVerbose(
                $"Created nuspec content: {Environment.NewLine}{File.ReadAllText(nuSpecFileCopyPath)}");

            ExitCode result = await ExecuteNuGetPackAsync(
                packageConfiguration.NuGetExePath,
                packageConfiguration.PackagesDirectory,
                _logger,
                nuSpecFileCopyPath,
                properties,
                nuSpecCopy,
                removedTags,
                cancellationToken : cancellationToken,
                ignoreWarnings : ignoreWarnings);

            return(result);
        }