diff --git a/Microsoft.DotNet.Cli.sln b/Microsoft.DotNet.Cli.sln
index a5f56ff79..22d771abd 100644
--- a/Microsoft.DotNet.Cli.sln
+++ b/Microsoft.DotNet.Cli.sln
@@ -21,6 +21,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Dotnet.Sdk.Intern
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SdkTests", "test\SdkTests\SdkTests.csproj", "{CB1EE94E-CB83-4071-9DD0-9929AE2B7282}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "core-sdk-tasks.Tests", "test\core-sdk-tasks.Tests\core-sdk-tasks.Tests.csproj", "{658EF9BE-452C-4D31-AA24-B9E2235799A8}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -55,6 +57,10 @@ Global
{CB1EE94E-CB83-4071-9DD0-9929AE2B7282}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CB1EE94E-CB83-4071-9DD0-9929AE2B7282}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CB1EE94E-CB83-4071-9DD0-9929AE2B7282}.Release|Any CPU.Build.0 = Release|Any CPU
+ {658EF9BE-452C-4D31-AA24-B9E2235799A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {658EF9BE-452C-4D31-AA24-B9E2235799A8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {658EF9BE-452C-4D31-AA24-B9E2235799A8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {658EF9BE-452C-4D31-AA24-B9E2235799A8}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -66,6 +72,7 @@ Global
{78E15EC1-7732-41E3-8591-934E9F583254} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
{7EE15292-2CAD-44FA-8A1F-BAC4688A49E0} = {ED2FE3E2-F7E7-4389-8231-B65123F2076F}
{CB1EE94E-CB83-4071-9DD0-9929AE2B7282} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
+ {658EF9BE-452C-4D31-AA24-B9E2235799A8} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {B526D2CE-EE2D-4AD4-93EF-1867D90FF1F5}
diff --git a/src/core-sdk-tasks/CalculateTemplateVersions.cs b/src/core-sdk-tasks/CalculateTemplateVersions.cs
new file mode 100644
index 000000000..7d02618d3
--- /dev/null
+++ b/src/core-sdk-tasks/CalculateTemplateVersions.cs
@@ -0,0 +1,84 @@
+// Copyright (c) .NET Foundation and contributors. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using Microsoft.Build.Framework;
+using Microsoft.Build.Utilities;
+
+namespace Microsoft.DotNet.Cli.Build
+{
+ public class CalculateTemplateVersions : Task
+ {
+ [Required]
+ public string AspNetCorePackageVersionTemplate { get; set; }
+
+ [Required]
+ public string GitCommitCount { get; set; }
+
+ [Required]
+ public string VersionSuffix { get; set; }
+
+ [Output]
+ public string BundledTemplateMSIVersion { get; set; }
+
+ [Output]
+ public string BundledTemplateInstallPath { get; set; }
+
+ [Output]
+ public string BundledTemplateMajorMinorVersion { get; set; }
+
+ public override bool Execute()
+ {
+ var result = Calculate(AspNetCorePackageVersionTemplate, GitCommitCount, VersionSuffix);
+ BundledTemplateMSIVersion = result.BundledTemplateMsiVersion;
+ BundledTemplateInstallPath = result.BundledTemplateInstallPath;
+ BundledTemplateMajorMinorVersion = result.BundledTemplateMajorMinorVersion;
+
+ return true;
+ }
+
+ public static
+ (string BundledTemplateMsiVersion,
+ string BundledTemplateInstallPath,
+ string BundledTemplateMajorMinorVersion) Calculate(string aspNetCorePackageVersionTemplate,
+ string gitCommitCount, string versionSuffix)
+ {
+ (bool isStableVersion, string aspNetCoreVersionMajorMinorPatchVersion) =
+ GetAspNetCoreVersionMajorMinorPatchVersion(aspNetCorePackageVersionTemplate);
+
+ var bundledTemplateMsiVersion = $"{aspNetCoreVersionMajorMinorPatchVersion}.{gitCommitCount}";
+
+ string bundledTemplateInstallPath = isStableVersion
+ ? aspNetCoreVersionMajorMinorPatchVersion
+ : $"{aspNetCoreVersionMajorMinorPatchVersion}-{versionSuffix}";
+
+ var parsedAspNetCoreVersionMajorMinorPatchVersion =
+ System.Version.Parse(aspNetCoreVersionMajorMinorPatchVersion);
+ var bundledTemplateMajorMinorVersion =
+ $"{parsedAspNetCoreVersionMajorMinorPatchVersion.Major}.{parsedAspNetCoreVersionMajorMinorPatchVersion.Minor}";
+
+ return (
+ bundledTemplateMsiVersion,
+ bundledTemplateInstallPath,
+ bundledTemplateMajorMinorVersion);
+ }
+
+ private static (bool isStableVersion, string aspNetCoreVersionMajorMinorPatchVersion)
+ GetAspNetCoreVersionMajorMinorPatchVersion(string aspNetCorePackageVersionTemplate)
+ {
+ var indexOfAspNetCoreVersionPreReleaseSeparator = aspNetCorePackageVersionTemplate.IndexOf('-');
+ string aspNetCoreVersionMajorMinorPatchVersion;
+ if (indexOfAspNetCoreVersionPreReleaseSeparator != -1)
+ {
+ aspNetCoreVersionMajorMinorPatchVersion =
+ aspNetCorePackageVersionTemplate.Substring(0, indexOfAspNetCoreVersionPreReleaseSeparator);
+ }
+ else
+ {
+ aspNetCoreVersionMajorMinorPatchVersion = aspNetCorePackageVersionTemplate;
+ }
+
+ return (indexOfAspNetCoreVersionPreReleaseSeparator == -1, aspNetCoreVersionMajorMinorPatchVersion);
+ }
+ }
+}
diff --git a/src/redist/targets/BuildCoreSdkTasks.targets b/src/redist/targets/BuildCoreSdkTasks.targets
index 7ffb389a9..d876cb37f 100644
--- a/src/redist/targets/BuildCoreSdkTasks.targets
+++ b/src/redist/targets/BuildCoreSdkTasks.targets
@@ -19,6 +19,7 @@
Properties="ArtifactsDir=$(ArtifactsDir)tasks\"/>
+
diff --git a/src/redist/targets/BundledTemplates.targets b/src/redist/targets/BundledTemplates.targets
index c24479389..709da201f 100644
--- a/src/redist/targets/BundledTemplates.targets
+++ b/src/redist/targets/BundledTemplates.targets
@@ -1,47 +1,38 @@
-
- $(AspNetCorePackageVersionFor31Templates.IndexOf('-'))
- $(AspNetCorePackageVersionFor31Templates)
- $(AspNetCorePackageVersionFor31Templates.Substring(0, $(AspNetCore31VersionPreReleaseSeparator)))
- $(AspNetCore31VersionMajorMinorPatchVersion).$(GitCommitCount)
- $(AspNetCore31VersionMajorMinorPatchVersion)
- $(BundledTemplates31InstallPath)-$(VersionSuffix)
- $([MSBuild]::Add($(AspNetCore31VersionMajorMinorPatchVersion.IndexOf('.')), 1))
- $(AspNetCore31VersionMajorMinorPatchVersion.IndexOf('.', $(Templates31VersionPatchSeparatorIndex)))
- $(AspNetCore31VersionMajorMinorPatchVersion.Substring(0, $(Templates31VersionPatchSeparatorIndex)))
- $(AspNetCorePackageVersionFor30Templates.IndexOf('-'))
- $(AspNetCorePackageVersionFor30Templates)
- $(AspNetCorePackageVersionFor30Templates.Substring(0, $(AspNetCore30VersionPreReleaseSeparator)))
- $(AspNetCore30VersionMajorMinorPatchVersion).$(GitCommitCount)
- $(AspNetCore30VersionMajorMinorPatchVersion)
- $(BundledTemplates30InstallPath)-$(VersionSuffix)
- $([MSBuild]::Add($(AspNetCore30VersionMajorMinorPatchVersion.IndexOf('.')), 1))
- $(AspNetCore30VersionMajorMinorPatchVersion.IndexOf('.', $(Templates30VersionPatchSeparatorIndex)))
- $(AspNetCore30VersionMajorMinorPatchVersion.Substring(0, $(Templates30VersionPatchSeparatorIndex)))
+
+
+
+
+
- $(AspNetCorePackageVersionFor22Templates.IndexOf('-'))
- $(AspNetCorePackageVersionFor22Templates)
- $(AspNetCorePackageVersionFor22Templates.Substring(0, $(AspNetCore22VersionPreReleaseSeparator)))
- $(AspNetCore22VersionMajorMinorPatchVersion).$(GitCommitCount)
- $(AspNetCore22VersionMajorMinorPatchVersion)
- $(BundledTemplates22InstallPath)-$(VersionSuffix)
- $([MSBuild]::Add($(AspNetCore22VersionMajorMinorPatchVersion.IndexOf('.')), 1))
- $(AspNetCore22VersionMajorMinorPatchVersion.IndexOf('.', $(Templates22VersionPatchSeparatorIndex)))
- $(AspNetCore22VersionMajorMinorPatchVersion.Substring(0, $(Templates22VersionPatchSeparatorIndex)))
+
+
+
+
+
- $(AspNetCorePackageVersionFor21Templates.IndexOf('-'))
- $(AspNetCorePackageVersionFor21Templates)
- $(AspNetCorePackageVersionFor21Templates.Substring(0, $(AspNetCore21VersionPreReleaseSeparator)))
- $(AspNetCore21VersionMajorMinorPatchVersion).$(GitCommitCount)
- $(AspNetCore21VersionMajorMinorPatchVersion)
- $(BundledTemplates21InstallPath)-$(VersionSuffix)
- $([MSBuild]::Add($(AspNetCore21VersionMajorMinorPatchVersion.IndexOf('.')), 1))
- $(AspNetCore21VersionMajorMinorPatchVersion.IndexOf('.', $(Templates21VersionPatchSeparatorIndex)))
- $(AspNetCore21VersionMajorMinorPatchVersion.Substring(0, $(Templates21VersionPatchSeparatorIndex)))
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/core-sdk-tasks.Tests/CalculateTemplateVerionsTests.cs b/test/core-sdk-tasks.Tests/CalculateTemplateVerionsTests.cs
new file mode 100644
index 000000000..6f5ca3919
--- /dev/null
+++ b/test/core-sdk-tasks.Tests/CalculateTemplateVerionsTests.cs
@@ -0,0 +1,27 @@
+using FluentAssertions;
+using Xunit;
+using Microsoft.DotNet.Cli.Build;
+
+namespace EndToEnd
+{
+ public class CalculateTemplateVerionsTests
+ {
+ [Fact]
+ public void ItCanCalculateTemplateVersionsInStableBuilds()
+ {
+ var result = CalculateTemplateVersions.Calculate("3.1.0", "014885", "dev");
+ result.BundledTemplateInstallPath.Should().Be("3.1.0");
+ result.BundledTemplateMsiVersion.Should().Be("3.1.0.014885");
+ result.BundledTemplateMajorMinorVersion.Should().Be("3.1");
+ }
+
+ [Fact]
+ public void ItCanCalculateTemplateVersionsInNonStableBuilds()
+ {
+ var result = CalculateTemplateVersions.Calculate("5.0.0-alpha.1.20071.6", "014885", "dev");
+ result.BundledTemplateInstallPath.Should().Be("5.0.0-dev");
+ result.BundledTemplateMsiVersion.Should().Be("5.0.0.014885");
+ result.BundledTemplateMajorMinorVersion.Should().Be("5.0");
+ }
+ }
+}
diff --git a/test/core-sdk-tasks.Tests/core-sdk-tasks.Tests.csproj b/test/core-sdk-tasks.Tests/core-sdk-tasks.Tests.csproj
new file mode 100644
index 000000000..47b6ce517
--- /dev/null
+++ b/test/core-sdk-tasks.Tests/core-sdk-tasks.Tests.csproj
@@ -0,0 +1,14 @@
+
+
+ $(CoreSdkTargetFramework);net472
+ $(CoreSdkTargetFramework)
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file