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..55d58fd40
--- /dev/null
+++ b/src/core-sdk-tasks/CalculateTemplateVersions.cs
@@ -0,0 +1,80 @@
+// 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 Microsoft.Build.Framework;
+using Microsoft.Build.Utilities;
+using NuGet.Versioning;
+
+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; }
+
+ private const int _patchVersionResetOffset = 1;
+
+ 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)
+ {
+ var aspNetCoreTemplate = NuGetVersion.Parse(aspNetCorePackageVersionTemplate);
+
+ NuGetVersion baseMajorMinorPatch = GetBaseMajorMinorPatch(aspNetCoreTemplate);
+
+ string bundledTemplateInstallPath = aspNetCoreTemplate.IsPrerelease
+ ? $"{baseMajorMinorPatch.Major}.{baseMajorMinorPatch.Minor}.{baseMajorMinorPatch.Patch}-{versionSuffix}"
+ : $"{baseMajorMinorPatch.Major}.{baseMajorMinorPatch.Minor}.{baseMajorMinorPatch.Patch}";
+
+ return (
+ $"{baseMajorMinorPatch.Major}.{baseMajorMinorPatch.Minor}.{baseMajorMinorPatch.Patch}.{gitCommitCount}",
+ bundledTemplateInstallPath,
+ $"{baseMajorMinorPatch.Major}.{baseMajorMinorPatch.Minor}");
+ }
+
+ private static NuGetVersion GetBaseMajorMinorPatch(NuGetVersion aspNetCoreTemplate)
+ {
+ // due to historical bug https://github.com/dotnet/core-sdk/issues/6243
+ // we need to increase patch version by one in order to "reset" existing install ComponentId
+ // more in the above bug's detail.
+ // There is no non-deterministic existing ComponentId under Major version 5.
+ // so only apply the patch bump when below 5
+
+ int basePatch =
+ aspNetCoreTemplate.Major < 5
+ ? aspNetCoreTemplate.Patch + _patchVersionResetOffset
+ : aspNetCoreTemplate.Patch;
+
+ var baseMajorMinorPatch = new NuGetVersion(aspNetCoreTemplate.Major, aspNetCoreTemplate.Minor,
+ basePatch);
+ return baseMajorMinorPatch;
+ }
+ }
+}
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/src/redist/targets/packaging/windows/clisdk/generatemsi.ps1 b/src/redist/targets/packaging/windows/clisdk/generatemsi.ps1
index d19137f5c..3920119b3 100644
--- a/src/redist/targets/packaging/windows/clisdk/generatemsi.ps1
+++ b/src/redist/targets/packaging/windows/clisdk/generatemsi.ps1
@@ -31,7 +31,7 @@ function RunHeat
# use XSLT tranform to match the file path contains "AppHostTemplate\apphost.exe" and give it the same ID all the time.
$heatOutput = .\heat.exe dir `"$inputDir`" -template fragment `
- -sreg -gg `
+ -sreg -ag `
-var var.DotnetSrc `
-cg InstallFiles `
-srd `
diff --git a/src/redist/targets/packaging/windows/clisdk/generatetemplatesmsi.ps1 b/src/redist/targets/packaging/windows/clisdk/generatetemplatesmsi.ps1
index a987c584c..7947d20a4 100644
--- a/src/redist/targets/packaging/windows/clisdk/generatetemplatesmsi.ps1
+++ b/src/redist/targets/packaging/windows/clisdk/generatetemplatesmsi.ps1
@@ -25,7 +25,7 @@ function RunHeat
Write-Information "Running heat.."
$heatOutput = .\heat.exe dir `"$inputDir`" -template fragment `
- -sreg -gg `
+ -sreg -ag `
-var var.DotnetSrc `
-cg InstallFiles `
-srd `
diff --git a/test/core-sdk-tasks.Tests/CalculateTemplateVerionsTests.cs b/test/core-sdk-tasks.Tests/CalculateTemplateVerionsTests.cs
new file mode 100644
index 000000000..8f25cc34e
--- /dev/null
+++ b/test/core-sdk-tasks.Tests/CalculateTemplateVerionsTests.cs
@@ -0,0 +1,49 @@
+using FluentAssertions;
+using Xunit;
+using Microsoft.DotNet.Cli.Build;
+
+namespace EndToEnd
+{
+ public class CalculateTemplateVersionsTests
+ {
+ [Fact]
+ public void WhenAspNetCoreTemplateMajorVersionLowerthan3ItCanCalculateTemplateVersionsInStableBuilds()
+ {
+ var result = CalculateTemplateVersions.Calculate("3.1.0", "014885", "dev");
+
+ result.Should()
+ .Be(("3.1.1.014885", "3.1.1", "3.1"),
+ "the patch is 1 higher than aspnetTemplateVersion " +
+ "due to https://github.com/dotnet/core-sdk/issues/6243");
+ }
+
+ [Fact]
+ public void WhenAspNetCoreTemplateMajorVersionLowerthan3ItCanCalculateTemplateVersionsInNonStableBuilds()
+ {
+ var result = CalculateTemplateVersions.Calculate("3.0.0-alpha.1.20071.6", "014885", "dev");
+
+ result.Should()
+ .Be(("3.0.1.014885", "3.0.1-dev", "3.0"));
+ }
+
+ [Fact]
+ public void WhenAspNetCoreTemplateMajorVersionHigherthan3ItCanCalculateTemplateVersionsInStableBuilds()
+ {
+ var result = CalculateTemplateVersions.Calculate("5.1.0", "014885", "dev");
+
+ result.Should()
+ .Be(("5.1.0.014885", "5.1.0", "5.1"),
+ "the patch align with AspNetCoreTemplateMajorVersion again, " +
+ "since there is no non-deterministic existing ComponentId under Major version 5.");
+ }
+
+ [Fact]
+ public void WhenAspNetCoreTemplateMajorVersionHigherthan3ItCanCalculateTemplateVersionsInNonStableBuilds()
+ {
+ var result = CalculateTemplateVersions.Calculate("5.0.0-alpha.1.20071.6", "014885", "dev");
+
+ result.Should()
+ .Be(("5.0.0.014885", "5.0.0-dev", "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