From bc15604c3b18cb0e11881e1d1656a34e93f99b5c Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Thu, 7 Oct 2021 17:41:11 -0600 Subject: [PATCH 1/2] Add property that can disable the private MSBuild task invocation This allows Nerdbank.GitVersioning to (once again) work under quickbuild. --- .../BuildIntegrationTests.cs | 22 +++++++ .../NerdBank.GitVersioning.Tests.csproj | 2 +- .../Nerdbank.GitVersioning.nuspec | 6 +- .../build/InProjectVersionComputation.targets | 20 ++++++ .../build/MSBuildTargetCaching.targets | 60 ++++++++++++++++++ .../Nerdbank.GitVersioning.Common.targets | 1 + ...Nerdbank.GitVersioning.Inner.Empty.targets | 9 +++ .../Nerdbank.GitVersioning.Inner.targets | 12 ++-- .../build/Nerdbank.GitVersioning.props | 15 +++++ .../build/Nerdbank.GitVersioning.targets | 63 ++----------------- .../Nerdbank.GitVersioning.props | 4 ++ 11 files changed, 147 insertions(+), 67 deletions(-) create mode 100644 src/Nerdbank.GitVersioning.Tasks/build/InProjectVersionComputation.targets create mode 100644 src/Nerdbank.GitVersioning.Tasks/build/MSBuildTargetCaching.targets create mode 100644 src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.Inner.Empty.targets create mode 100644 src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.props create mode 100644 src/Nerdbank.GitVersioning.Tasks/buildCrossTargeting/Nerdbank.GitVersioning.props diff --git a/src/NerdBank.GitVersioning.Tests/BuildIntegrationTests.cs b/src/NerdBank.GitVersioning.Tests/BuildIntegrationTests.cs index 3b4e00ea..57727e10 100644 --- a/src/NerdBank.GitVersioning.Tests/BuildIntegrationTests.cs +++ b/src/NerdBank.GitVersioning.Tests/BuildIntegrationTests.cs @@ -39,6 +39,25 @@ protected override void ApplyGlobalProperties(IDictionary global => globalProperties["NBGV_GitEngine"] = "Managed"; } +[Trait("Engine", "Managed")] +[Collection("Build")] // msbuild sets current directory in the process, so we can't have it be concurrent with other build tests. +public class BuildIntegrationInProjectManagedTests : BuildIntegrationTests +{ + public BuildIntegrationInProjectManagedTests(ITestOutputHelper logger) + : base(logger) + { + } + + protected override GitContext CreateGitContext(string path, string committish = null) + => GitContext.Create(path, committish, writable: false); + + protected override void ApplyGlobalProperties(IDictionary globalProperties) + { + globalProperties["NBGV_GitEngine"] = "Managed"; + globalProperties["NBGV_CacheMode"] = "None"; + } +} + [Trait("Engine", "LibGit2")] [Collection("Build")] // msbuild sets current directory in the process, so we can't have it be concurrent with other build tests. public class BuildIntegrationLibGit2Tests : BuildIntegrationTests @@ -57,6 +76,7 @@ protected override void ApplyGlobalProperties(IDictionary global public abstract class BuildIntegrationTests : RepoTestBase, IClassFixture { + private const string GitVersioningPropsFileName = "NerdBank.GitVersioning.props"; private const string GitVersioningTargetsFileName = "NerdBank.GitVersioning.targets"; private const string UnitTestCloudBuildPrefix = "UnitTest: "; private static readonly string[] ToxicEnvironmentVariablePrefixes = new string[] @@ -1175,6 +1195,7 @@ private ProjectRootElement CreateNativeProjectRootElement(string projectDirector { var pre = ProjectRootElement.Create(reader, this.projectCollection); pre.FullPath = Path.Combine(projectDirectory, projectName); + pre.InsertAfterChild(pre.CreateImportElement(Path.Combine(this.RepoPath, GitVersioningPropsFileName)), null); pre.AddImport(Path.Combine(this.RepoPath, GitVersioningTargetsFileName)); return pre; } @@ -1186,6 +1207,7 @@ private ProjectRootElement CreateProjectRootElement(string projectDirectory, str { var pre = ProjectRootElement.Create(reader, this.projectCollection); pre.FullPath = Path.Combine(projectDirectory, projectName); + pre.InsertAfterChild(pre.CreateImportElement(Path.Combine(this.RepoPath, GitVersioningPropsFileName)), null); pre.AddImport(Path.Combine(this.RepoPath, GitVersioningTargetsFileName)); return pre; } diff --git a/src/NerdBank.GitVersioning.Tests/NerdBank.GitVersioning.Tests.csproj b/src/NerdBank.GitVersioning.Tests/NerdBank.GitVersioning.Tests.csproj index 9e4bd7ef..e82aaab4 100644 --- a/src/NerdBank.GitVersioning.Tests/NerdBank.GitVersioning.Tests.csproj +++ b/src/NerdBank.GitVersioning.Tests/NerdBank.GitVersioning.Tests.csproj @@ -12,7 +12,7 @@ - + false Targets\%(FileName)%(Extension) diff --git a/src/Nerdbank.GitVersioning.Tasks/Nerdbank.GitVersioning.nuspec b/src/Nerdbank.GitVersioning.Tasks/Nerdbank.GitVersioning.nuspec index 47223cac..47107c37 100644 --- a/src/Nerdbank.GitVersioning.Tasks/Nerdbank.GitVersioning.nuspec +++ b/src/Nerdbank.GitVersioning.Tasks/Nerdbank.GitVersioning.nuspec @@ -48,9 +48,13 @@ IMPORTANT: The 3.x release may produce a different version height than prior maj - + + + + + diff --git a/src/Nerdbank.GitVersioning.Tasks/build/InProjectVersionComputation.targets b/src/Nerdbank.GitVersioning.Tasks/build/InProjectVersionComputation.targets new file mode 100644 index 00000000..349fff64 --- /dev/null +++ b/src/Nerdbank.GitVersioning.Tasks/build/InProjectVersionComputation.targets @@ -0,0 +1,20 @@ + + + + + + + @(BuildMetadata, ',') + + + + + + + + + + + + diff --git a/src/Nerdbank.GitVersioning.Tasks/build/MSBuildTargetCaching.targets b/src/Nerdbank.GitVersioning.Tasks/build/MSBuildTargetCaching.targets new file mode 100644 index 00000000..9bf0e1e0 --- /dev/null +++ b/src/Nerdbank.GitVersioning.Tasks/build/MSBuildTargetCaching.targets @@ -0,0 +1,60 @@ + + + $(NBGV_InnerGlobalProperties)GitRepoRoot=$(GitRepoRoot); + $(NBGV_InnerGlobalProperties)PublicRelease=$(PublicRelease); + $(NBGV_InnerGlobalProperties)_NBGV_BuildingRef=$(_NBGV_BuildingRef); + $(NBGV_InnerGlobalProperties)ProjectPathRelativeToGitRepoRoot=$(ProjectPathRelativeToGitRepoRoot); + $(NBGV_InnerGlobalProperties)GitVersionBaseDirectory=$(GitVersionBaseDirectory); + $(NBGV_InnerGlobalProperties)OverrideBuildNumberOffset=$(OverrideBuildNumberOffset); + $(NBGV_InnerGlobalProperties)NBGV_CacheMode=$(NBGV_CacheMode); + + + + + + + + + + <_BuildMetadataSnapped Include="@(BuildMetadata)" /> + + + + + + GetBuildVersion_Properties;GetBuildVersion_CloudBuildVersionVars + $(NBGV_InnerGlobalProperties)BuildMetadata=@(BuildMetadata, ','); + @(NBGV_GlobalPropertiesToRemove) + + + false + false + true + false + true + + + + + + + + + + + + + + + + + diff --git a/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.Common.targets b/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.Common.targets index 047e2420..a360732f 100644 --- a/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.Common.targets +++ b/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.Common.targets @@ -1,6 +1,7 @@  + <_NBGV_Common_Targets_Imported>true <_NBGV_PlatformSuffix Condition=" '$(_NBGV_PlatformSuffix)' == '' and '$(MSBuildRuntimeType)' == 'Core' ">MSBuildCore/ <_NBGV_PlatformSuffix Condition=" '$(_NBGV_PlatformSuffix)' == '' ">MSBuildFull/ $(MSBuildThisFileDirectory)$(_NBGV_PlatformSuffix) diff --git a/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.Inner.Empty.targets b/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.Inner.Empty.targets new file mode 100644 index 00000000..02f61168 --- /dev/null +++ b/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.Inner.Empty.targets @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.Inner.targets b/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.Inner.targets index 8075fb21..1cbafadb 100644 --- a/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.Inner.targets +++ b/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.Inner.targets @@ -1,7 +1,7 @@  - + @@ -18,7 +18,7 @@ BuildingRef="$(_NBGV_BuildingRef)" BuildMetadata="$(BuildMetadata.Replace(',',';'))" DefaultPublicRelease="$(PublicRelease)" - ProjectDirectory="$(ProjectDirectory)" + ProjectDirectory="$(GitVersionBaseDirectory)" GitRepoRoot="$(GitRepoRoot)" ProjectPathRelativeToGitRepoRoot="$(ProjectPathRelativeToGitRepoRoot)" OverrideBuildNumberOffset="$(OverrideBuildNumberOffset)" @@ -42,11 +42,7 @@ - - - - - - + + \ No newline at end of file diff --git a/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.props b/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.props new file mode 100644 index 00000000..5ebd8c16 --- /dev/null +++ b/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.props @@ -0,0 +1,15 @@ + + + + None + MSBuildTargetCaching + + diff --git a/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.targets b/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.targets index 33a2910f..abc90c9e 100644 --- a/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.targets +++ b/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.targets @@ -25,7 +25,7 @@ false - + @@ -37,7 +37,7 @@ - false + false @@ -64,54 +64,9 @@ <_NBGV_BuildingRef Condition=" '$(_NBGV_BuildingRef)' == '' ">$(_NBGV_BuildingBranch) $(MSBuildProjectDirectory) - $(NBGV_InnerGlobalProperties)GitRepoRoot=$(GitRepoRoot); - $(NBGV_InnerGlobalProperties)PublicRelease=$(PublicRelease); - $(NBGV_InnerGlobalProperties)_NBGV_BuildingRef=$(_NBGV_BuildingRef); - $(NBGV_InnerGlobalProperties)ProjectPathRelativeToGitRepoRoot=$(ProjectPathRelativeToGitRepoRoot); - $(NBGV_InnerGlobalProperties)ProjectDirectory=$(GitVersionBaseDirectory); - $(NBGV_InnerGlobalProperties)OverrideBuildNumberOffset=$(OverrideBuildNumberOffset); - $(MSBuildThisFileDirectory)Nerdbank.GitVersioning.Inner.targets - - - - - - - - <_BuildMetadataSnapped Include="@(BuildMetadata)" /> - - - - - - GetBuildVersion_Properties;GetBuildVersion_CloudBuildVersionVars - $(NBGV_InnerGlobalProperties)BuildMetadata=@(BuildMetadata, ','); - @(NBGV_GlobalPropertiesToRemove) - - - false - false - true - false - true - - - - - - - - - - - + %(Value) - - - - - + + + + + + From f0e05d18c0cce260fb2a92b2e415d5fe67f70047 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Fri, 8 Oct 2021 06:49:43 -0600 Subject: [PATCH 2/2] Allow sharing version computation with a user-owned project Quickbuild requires that every P2P be to a git-controlled project. This makes it incompatible with NB.GV's running the MSBuild task to one of its own .targets files. To workaround this, a quickbuild user will have to define their own project that does nothing but compute the version using NB.GV, and then set `NBGV_CachingProjectReference` to the full path to this custom project. Note that no actual *caching* occurs at this stage when under quickbuild because quickbuild uses a new top-level msbuild call for every project. We'll need to combine this with caching version info to a file on disk for this to be a perf improvement in quickbuild. --- doc/quickbuild.md | 55 +++++++++++++++++++ .../NerdBank.GitVersioning.Tests.csproj | 2 +- .../Nerdbank.GitVersioning.nuspec | 2 +- .../build/MSBuildTargetCaching.targets | 17 ++++-- .../Nerdbank.GitVersioning.Inner.targets | 2 - .../build/Nerdbank.GitVersioning.props | 5 ++ .../build/Nerdbank.GitVersioning.targets | 1 + ...r.Empty.targets => PrivateP2PCaching.proj} | 5 +- 8 files changed, 80 insertions(+), 9 deletions(-) create mode 100644 doc/quickbuild.md rename src/Nerdbank.GitVersioning.Tasks/build/{Nerdbank.GitVersioning.Inner.Empty.targets => PrivateP2PCaching.proj} (63%) diff --git a/doc/quickbuild.md b/doc/quickbuild.md new file mode 100644 index 00000000..0fc733b5 --- /dev/null +++ b/doc/quickbuild.md @@ -0,0 +1,55 @@ +# Microsoft's (internal) quickbuild + +Nerdbank.GitVersioning supports the Microsoft-internal quickbuild/cloudbuild tool. + +It works out of the box, but each project will recompute the version, which may accumulate to a significant increase in overall build time. + +🚧 A future version of Nerdbank.GitVersioning will cache version information as a file so that the following instructions will be effective. 🚧 + +To calculate the version just once for an entire build, a few manual steps are required. + +1. Create this project in your repo. The suggested location is `VersionGeneration/VersionGeneration.msbuildproj`. + + ```xml + + + net5.0 + false + true + VersionGenerationTarget + + + ``` + + The `TargetFramework` property value is not important as no assemblies are built by this project, + but a value is nonetheless required for NuGet to be willing to consume the Nerdbank.GitVersioning package reference + (which is referenced in Directory.Build.props as described later). + +1. Add the SDK version to your repo-root level `global.json` file, if it is not already present. + The [latest available version from nuget.org](https://www.nuget.org/packages/microsoft.build.notargets) is recommended. + + ```json + { + "msbuild-sdks": { + "Microsoft.Build.NoTargets": "3.1.0" + } + } + ``` + +1. Modify your repo-root level `Directory.Build.props` file to contain these elements: + + ```xml + + + $(MSBuildThisFileDirectory) + + + + MSBuildTargetCaching + $(MSBuildThisFileDirectory)VersionGeneration\VersionGeneration.msbuildproj + + + + + + ``` diff --git a/src/NerdBank.GitVersioning.Tests/NerdBank.GitVersioning.Tests.csproj b/src/NerdBank.GitVersioning.Tests/NerdBank.GitVersioning.Tests.csproj index e82aaab4..1e9f8e11 100644 --- a/src/NerdBank.GitVersioning.Tests/NerdBank.GitVersioning.Tests.csproj +++ b/src/NerdBank.GitVersioning.Tests/NerdBank.GitVersioning.Tests.csproj @@ -12,7 +12,7 @@ - + false Targets\%(FileName)%(Extension) diff --git a/src/Nerdbank.GitVersioning.Tasks/Nerdbank.GitVersioning.nuspec b/src/Nerdbank.GitVersioning.Tasks/Nerdbank.GitVersioning.nuspec index 47107c37..668b210e 100644 --- a/src/Nerdbank.GitVersioning.Tasks/Nerdbank.GitVersioning.nuspec +++ b/src/Nerdbank.GitVersioning.Tasks/Nerdbank.GitVersioning.nuspec @@ -52,9 +52,9 @@ IMPORTANT: The 3.x release may produce a different version height than prior maj - + diff --git a/src/Nerdbank.GitVersioning.Tasks/build/MSBuildTargetCaching.targets b/src/Nerdbank.GitVersioning.Tasks/build/MSBuildTargetCaching.targets index 9bf0e1e0..7e2b97ca 100644 --- a/src/Nerdbank.GitVersioning.Tasks/build/MSBuildTargetCaching.targets +++ b/src/Nerdbank.GitVersioning.Tasks/build/MSBuildTargetCaching.targets @@ -6,22 +6,30 @@ $(NBGV_InnerGlobalProperties)ProjectPathRelativeToGitRepoRoot=$(ProjectPathRelativeToGitRepoRoot); $(NBGV_InnerGlobalProperties)GitVersionBaseDirectory=$(GitVersionBaseDirectory); $(NBGV_InnerGlobalProperties)OverrideBuildNumberOffset=$(OverrideBuildNumberOffset); - $(NBGV_InnerGlobalProperties)NBGV_CacheMode=$(NBGV_CacheMode); - - <_BuildMetadataSnapped Include="@(BuildMetadata)" /> + + + $(NBGV_InnerGlobalProperties)Configuration=Release; + $(NBGV_InnerGlobalProperties)Platform=AnyCPU; + + + + + + - + GetBuildVersion_Properties;GetBuildVersion_CloudBuildVersionVars $(NBGV_InnerGlobalProperties)BuildMetadata=@(BuildMetadata, ','); @(NBGV_GlobalPropertiesToRemove) @@ -32,6 +40,7 @@ true false true + all diff --git a/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.Inner.targets b/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.Inner.targets index 1cbafadb..ac037a13 100644 --- a/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.Inner.targets +++ b/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.Inner.targets @@ -43,6 +43,4 @@ - - \ No newline at end of file diff --git a/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.props b/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.props index 5ebd8c16..0c994a77 100644 --- a/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.props +++ b/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.props @@ -11,5 +11,10 @@ --> None MSBuildTargetCaching + + + $(MSBuildThisFileDirectory)PrivateP2PCaching.proj diff --git a/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.targets b/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.targets index abc90c9e..232ee06b 100644 --- a/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.targets +++ b/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.targets @@ -38,6 +38,7 @@ false + false diff --git a/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.Inner.Empty.targets b/src/Nerdbank.GitVersioning.Tasks/build/PrivateP2PCaching.proj similarity index 63% rename from src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.Inner.Empty.targets rename to src/Nerdbank.GitVersioning.Tasks/build/PrivateP2PCaching.proj index 02f61168..0245b1ae 100644 --- a/src/Nerdbank.GitVersioning.Tasks/build/Nerdbank.GitVersioning.Inner.Empty.targets +++ b/src/Nerdbank.GitVersioning.Tasks/build/PrivateP2PCaching.proj @@ -1,4 +1,7 @@ - + + + +