From d930de930e9fd2f830e7631ad3b9f0e7a93fc146 Mon Sep 17 00:00:00 2001 From: Andrew Boyarshin Date: Fri, 3 Apr 2020 20:37:52 +0700 Subject: [PATCH] Major per-RuntimeIdentifier build refactoring --- MSBuild.Sdk.Extras.sln | 9 +- README.md | 42 +++- Source/MSBuild.Sdk.Extras/Build/RIDs.targets | 227 ++++++++++-------- ...ClasslibPackNonRidSpecificCustomTfm.csproj | 19 ++ ...lasslibPackNonRidSpecificCustomTfms.csproj | 19 ++ ...lasslibPackNonRidSpecificDefaultTfm.csproj | 18 ++ ...asslibPackNonRidSpecificDefaultTfms.csproj | 18 ++ .../ClasslibPackNonRidSpecificSkipTfm.csproj | 19 ++ .../ClasslibPackNonRidSpecificSkipTfms.csproj | 19 ++ .../ClasslibPackRidSpecificCustomTfm.csproj | 52 ++++ .../ClasslibPackRidSpecificCustomTfms.csproj | 52 ++++ .../ClasslibPackRidSpecificDefaultTfm.csproj | 51 ++++ .../ClasslibPackRidSpecificDefaultTfms.csproj | 51 ++++ .../ClasslibPackRidSpecificSkipTfm.csproj | 40 +++ .../ClasslibPackRidSpecificSkipTfms.csproj | 40 +++ Tests/ClasslibPackTests.msbuildproj | 60 +++++ Tests/Directory.Build.props | 7 + Tests/Directory.Build.targets | 45 +++- 18 files changed, 680 insertions(+), 108 deletions(-) create mode 100644 Tests/ClasslibPackNonRidSpecificCustomTfm/ClasslibPackNonRidSpecificCustomTfm.csproj create mode 100644 Tests/ClasslibPackNonRidSpecificCustomTfms/ClasslibPackNonRidSpecificCustomTfms.csproj create mode 100644 Tests/ClasslibPackNonRidSpecificDefaultTfm/ClasslibPackNonRidSpecificDefaultTfm.csproj create mode 100644 Tests/ClasslibPackNonRidSpecificDefaultTfms/ClasslibPackNonRidSpecificDefaultTfms.csproj create mode 100644 Tests/ClasslibPackNonRidSpecificSkipTfm/ClasslibPackNonRidSpecificSkipTfm.csproj create mode 100644 Tests/ClasslibPackNonRidSpecificSkipTfms/ClasslibPackNonRidSpecificSkipTfms.csproj create mode 100644 Tests/ClasslibPackRidSpecificCustomTfm/ClasslibPackRidSpecificCustomTfm.csproj create mode 100644 Tests/ClasslibPackRidSpecificCustomTfms/ClasslibPackRidSpecificCustomTfms.csproj create mode 100644 Tests/ClasslibPackRidSpecificDefaultTfm/ClasslibPackRidSpecificDefaultTfm.csproj create mode 100644 Tests/ClasslibPackRidSpecificDefaultTfms/ClasslibPackRidSpecificDefaultTfms.csproj create mode 100644 Tests/ClasslibPackRidSpecificSkipTfm/ClasslibPackRidSpecificSkipTfm.csproj create mode 100644 Tests/ClasslibPackRidSpecificSkipTfms/ClasslibPackRidSpecificSkipTfms.csproj create mode 100644 Tests/ClasslibPackTests.msbuildproj create mode 100644 Tests/Directory.Build.props diff --git a/MSBuild.Sdk.Extras.sln b/MSBuild.Sdk.Extras.sln index 7ffac78..f8c3060 100644 --- a/MSBuild.Sdk.Extras.sln +++ b/MSBuild.Sdk.Extras.sln @@ -36,7 +36,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{19A683CB Tools\MSBuild.Packaging.targets = Tools\MSBuild.Packaging.targets EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UwpClassLibrary", "Tests\UwpClassLibrary\UwpClassLibrary.csproj", "{B7617E50-4107-4C19-BDCF-012CCDB22FB0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UwpClassLibrary", "Tests\UwpClassLibrary\UwpClassLibrary.csproj", "{B7617E50-4107-4C19-BDCF-012CCDB22FB0}" +EndProject +Project("{13B669BE-BB05-4DDF-9536-439F39A36129}") = "ClasslibPackTests", "Tests\ClasslibPackTests.msbuildproj", "{8DB76FFF-B050-433B-B478-1FC44DB9DF6B}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -80,6 +82,10 @@ Global {B7617E50-4107-4C19-BDCF-012CCDB22FB0}.Debug|Any CPU.Build.0 = Debug|Any CPU {B7617E50-4107-4C19-BDCF-012CCDB22FB0}.Release|Any CPU.ActiveCfg = Release|Any CPU {B7617E50-4107-4C19-BDCF-012CCDB22FB0}.Release|Any CPU.Build.0 = Release|Any CPU + {8DB76FFF-B050-433B-B478-1FC44DB9DF6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8DB76FFF-B050-433B-B478-1FC44DB9DF6B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8DB76FFF-B050-433B-B478-1FC44DB9DF6B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8DB76FFF-B050-433B-B478-1FC44DB9DF6B}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -94,6 +100,7 @@ Global {C2EE161F-0521-47F7-BE2D-0B55CA8B3C53} = {26026DB4-DD68-43BF-8858-15AD2016C0B2} {19A683CB-8C5D-480B-8D60-30F28DA40660} = {8647C74A-083C-4EAF-B9B0-2172D4A27BFC} {B7617E50-4107-4C19-BDCF-012CCDB22FB0} = {26026DB4-DD68-43BF-8858-15AD2016C0B2} + {8DB76FFF-B050-433B-B478-1FC44DB9DF6B} = {26026DB4-DD68-43BF-8858-15AD2016C0B2} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {93349570-79D8-4F89-8E78-C66401620727} diff --git a/README.md b/README.md index 14f1af8..80ee82e 100644 --- a/README.md +++ b/README.md @@ -97,23 +97,45 @@ More information on how SDK's are resolved can be found [here](https://docs.micr ### Creating Per-RuntimeIdentifier packages -You'll need a few things +You'll need to perform a few simple steps: -1. Make sure to use `TargetFrameworks` instead of `TargetFramework`, even if you're only building a single target framework. I am piggy-backing off of its looping capabilities. -2. Set the `RuntimeIdentifiers` property to [valid RID's](https://docs.microsoft.com/en-us/dotnet/core/rid-catalog) ([full list](https://github.com/dotnet/runtime/blob/master/src/libraries/pkg/Microsoft.NETCore.Platforms/runtime.json)), separated by a semi-colon. (`win;unix`). These can be set per TFM using a condition on the property. This lets you have multiple TFM's, but only some of which have RID's. -3. For the TFM's that you want want to build separately, set the property `ExtrasBuildEachRuntimeIdentifier` to `true`. +1. Set the `RuntimeIdentifiers` property to [valid RID's](https://docs.microsoft.com/en-us/dotnet/core/rid-catalog) ([full list](https://github.com/dotnet/runtime/blob/master/src/libraries/pkg/Microsoft.NETCore.Platforms/runtime.json)), separated by a semi-colon (`win;unix`). +2. For the TFM's that you want want to build separately, set the `ExtrasBuildEachRuntimeIdentifier` property to `true`. -Note: You must use the `Sdk="MSBuild.Sdk.Extras"` method for this. Using `PackageReference` is unsupported for this scenario. +When you're done, you should be able to run build/pack and it'll produce a NuGet package. -While the Visual Studio context won't show each RID, it'll build for each. The Extras defines a symbol for each RID for use (`win-x86` would be `WIN_X86` and `centos.7-x64` would be `CENTOS_7_X64`). Dots and dashes become underbars. +Notes: +* You must use the `Sdk="MSBuild.Sdk.Extras"` method for this. Using `PackageReference` is unsupported for this scenario. +* While the Visual Studio context won't show each RID, it'll build for each. +* The Extras defines a preprocessor symbol for each RID for use (`win-x86` would be `WIN_X86` and `centos.7-x64` would be `CENTOS_7_X64`). Dots and dashes become underbars. +* The default path for per-RID output assemblies and symbols in NuGet package is `runtimes//lib/`. +* `RuntimeIdentifiers` can be set per-`TargetFramework` using a condition on the property. This lets you have multiple TFM's, but only some of which have RID's. -You will also need a Reference Assembly for the `ref` folder. Please see my [two](https://claires.site/2018/07/09/create-and-pack-reference-assemblies-made-easy/) [blogs](https://claires.site/2018/07/03/create-and-pack-reference-assemblies/) articles for details. - -When you're done, you should be able to build/pack these and it'll create a NuGet package. Your per-RID targets will be in `runtimes//lib/` and the Reference Assembly will be in `ref/`. +#### Reference Assemblies +You will likely need to create reference assemblies to simplify development and consumption of your libraries with complex flavor (`TargetFramework` × `RuntimeIdentifier`) matrix. +Reference assemblies are packed into `ref/` folder. Please see my [two](https://claires.site/2018/07/09/create-and-pack-reference-assemblies-made-easy/) [blogs](https://claires.site/2018/07/03/create-and-pack-reference-assemblies/) articles for details. +#### Packing additional contents If you need to add native assets into runtimes, the easiest way is to use: +```xml + +``` + +#### Overriding content paths in output package +Minimal example to pack output assemblies and symbols to `tools` (instead of `runtimes`) subfolders. +```xml + + IncludeDefaultProjectBuildOutputInPack + + + + + + + +``` -`` +For advanced options, see _ClasslibPack*_ SDK tests and _RIDs.targets_ file. ### Migrate from the old way (VS pre-15.6) diff --git a/Source/MSBuild.Sdk.Extras/Build/RIDs.targets b/Source/MSBuild.Sdk.Extras/Build/RIDs.targets index 5db305d..2ab84ff 100644 --- a/Source/MSBuild.Sdk.Extras/Build/RIDs.targets +++ b/Source/MSBuild.Sdk.Extras/Build/RIDs.targets @@ -2,76 +2,97 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + _SdkIncludeDefaultProjectBuildOutputInPackImpl - - - false - + - <_SdkRuntimeIds Include="$(RuntimeIdentifiers)" Condition="'$(RuntimeIdentifiers)' != '' and '$(ExtrasBuildEachRuntimeIdentifier)' == 'true' " TargetFramework="$(TargetFramework)" /> + <_SdkRuntimeIds Include="$(RuntimeIdentifiers)" Condition="'$(RuntimeIdentifiers)' != '' and '$(ExtrasBuildEachRuntimeIdentifier)' == 'true' " TargetFramework="$(TargetFramework)" /> - <_SdkRuntimeId Include="@(_SdkRuntimeIds->'%(TargetFramework)')" Rid="%(_SdkRuntimeIds.Identity)" /> - <_SdkRuntimeId Include="$(TargetFramework)" Condition="'$(ExtrasBuildEachRuntimeIdentifier)' == 'false'" /> + <_SdkRuntimeId Include="@(_SdkRuntimeIds->'%(TargetFramework)')" Rid="%(_SdkRuntimeIds.Identity)" /> + <_SdkRuntimeId Include="$(TargetFramework)" Condition="'$(ExtrasBuildEachRuntimeIdentifier)' != 'true'" /> - + - + <_TargetFramework Include="$(TargetFrameworks)" /> + + <_TargetFrameworkNormalized Include="@(_TargetFramework->Trim()->Distinct())" /> + + + + - <_InnerBuildProjects Include="$(MSBuildProjectFile)"> - TargetFramework=%(_TargetFramework.Identity) - + <_TargetFrameworkNormalized Include="@(_TargetFrameworks)" /> + + - + + + <_SdkProjectFlavorMatrixItem Include="$(MSBuildProjectFullPath)"> + TargetFramework=%(_TargetFrameworkNormalized.Identity) + + + + + - + - <_InnerBuildProjects Remove="@(_InnerBuildProjects)" /> - <_InnerBuildProjects Include="$(MSBuildProjectFile)"> - TargetFramework=%(_SdkTargetsWithRids.Identity);RuntimeIdentifier=%(_SdkTargetsWithRids.Rid) - TargetFramework=%(_SdkTargetsWithRids.Identity) - + <_SdkProjectFlavorMatrixItem Remove="@(_SdkProjectFlavorMatrixItem)" /> + <_SdkProjectFlavorMatrixItem Include="@(_SdkProjectFlavorMatrixItemStaging->'%(OriginalItemSpec)')" KeepMetadata="TargetFramework;SetTargetFramework;Rid;SetRuntimeIdentifier" /> + <_SdkProjectFlavorMatrixItemStaging Remove="@(_SdkProjectFlavorMatrixItemStaging)" /> + <_SdkProjectFlavorMatrixItem Update="@(_SdkProjectFlavorMatrixItem)"> + RuntimeIdentifier=%(_SdkProjectFlavorMatrixItem.Rid) + + + + + + - - - - + + <_InnerBuildProjects Include="@(_SdkProjectFlavorMatrixItem)" KeepMetadata="FakeProperty"> + %(SetTargetFramework);%(SetRuntimeIdentifier) + %(SetTargetFramework) + + - + - - + + + + + false + TargetFramework;Rid + + Condition="'$(IncludeBuildOutput)' == 'true'" + Projects="@(_SdkProjectFlavorMatrixItem)" + Targets="_SdkGetBuildOutputFilesWithTfm" + Properties="%(_SdkProjectFlavorMatrixItem.SetTargetFramework); %(_SdkProjectFlavorMatrixItem.SetRuntimeIdentifier)"> + Properties="%(_SdkProjectFlavorMatrixItem.SetTargetFramework); %(_SdkProjectFlavorMatrixItem.SetRuntimeIdentifier)"> - - - - - - - - - - + Properties="%(_SdkProjectFlavorMatrixItem.SetTargetFramework); %(_SdkProjectFlavorMatrixItem.SetRuntimeIdentifier)"> + Properties="%(_SdkProjectFlavorMatrixItem.SetTargetFramework); BuildProjectReferences=false"> + Properties="%(_SdkProjectFlavorMatrixItem.SetTargetFramework); BuildProjectReferences=false"> + Properties="%(_SdkProjectFlavorMatrixItem.SetTargetFramework); BuildProjectReferences=false"> + <_BuildOutputInPackageWithRid Include="@(_BuildOutputInPackage->HasMetadata('Rid'))" /> + <_TargetPathsToSymbolsWithRid Include="@(_TargetPathsToSymbols->HasMetadata('Rid'))" /> + <_BuildOutputInPackageWithRid Remove="@(_BuildOutputInPackageWithRid)" Condition="'%(Rid)' == ''" /> + <_TargetPathsToSymbolsWithRid Remove="@(_TargetPathsToSymbolsWithRid)" Condition="'%(Rid)' == ''" /> + <_BuildOutputInPackage Remove="@(_BuildOutputInPackageWithRid)" /> + <_TargetPathsToSymbols Remove="@(_TargetPathsToSymbolsWithRid)" /> + + + - - - - - - + - + <_MissingRidSpecificOutput Include="@(RidSpecificOutput)" Condition="!Exists('%(Identity)')"/> + + + + + + + + + + + + + false + + + + + + <_BuildOutputInPackageWithRid Remove="@(_BuildOutputInPackageWithRid)" /> + <_TargetPathsToSymbolsWithRid Remove="@(_TargetPathsToSymbolsWithRid)" /> - + + + + false + + + Pack + + + + - <_TargetPathsToSymbolsWithTfm Update="@(_TargetPathsToSymbolsWithTfm)" Rid="$(RuntimeIdentifier)" /> + - + - - - - + + + + + + + + + + + <_TargetPathsToSymbolsWithTfm Update="@(_TargetPathsToSymbolsWithTfm)" Rid="$(RuntimeIdentifier)" /> + diff --git a/Tests/ClasslibPackNonRidSpecificCustomTfm/ClasslibPackNonRidSpecificCustomTfm.csproj b/Tests/ClasslibPackNonRidSpecificCustomTfm/ClasslibPackNonRidSpecificCustomTfm.csproj new file mode 100644 index 0000000..e897f86 --- /dev/null +++ b/Tests/ClasslibPackNonRidSpecificCustomTfm/ClasslibPackNonRidSpecificCustomTfm.csproj @@ -0,0 +1,19 @@ + + + + + + netstandard2.0 + IncludeDefaultProjectBuildOutputInPack + + + + + + + + + + + + diff --git a/Tests/ClasslibPackNonRidSpecificCustomTfms/ClasslibPackNonRidSpecificCustomTfms.csproj b/Tests/ClasslibPackNonRidSpecificCustomTfms/ClasslibPackNonRidSpecificCustomTfms.csproj new file mode 100644 index 0000000..985f1ed --- /dev/null +++ b/Tests/ClasslibPackNonRidSpecificCustomTfms/ClasslibPackNonRidSpecificCustomTfms.csproj @@ -0,0 +1,19 @@ + + + + + + netstandard2.0 + IncludeDefaultProjectBuildOutputInPack + + + + + + + + + + + + diff --git a/Tests/ClasslibPackNonRidSpecificDefaultTfm/ClasslibPackNonRidSpecificDefaultTfm.csproj b/Tests/ClasslibPackNonRidSpecificDefaultTfm/ClasslibPackNonRidSpecificDefaultTfm.csproj new file mode 100644 index 0000000..b68411c --- /dev/null +++ b/Tests/ClasslibPackNonRidSpecificDefaultTfm/ClasslibPackNonRidSpecificDefaultTfm.csproj @@ -0,0 +1,18 @@ + + + + + + netstandard2.0 + + + + + + + + + + + + diff --git a/Tests/ClasslibPackNonRidSpecificDefaultTfms/ClasslibPackNonRidSpecificDefaultTfms.csproj b/Tests/ClasslibPackNonRidSpecificDefaultTfms/ClasslibPackNonRidSpecificDefaultTfms.csproj new file mode 100644 index 0000000..c113394 --- /dev/null +++ b/Tests/ClasslibPackNonRidSpecificDefaultTfms/ClasslibPackNonRidSpecificDefaultTfms.csproj @@ -0,0 +1,18 @@ + + + + + + netstandard2.0 + + + + + + + + + + + + diff --git a/Tests/ClasslibPackNonRidSpecificSkipTfm/ClasslibPackNonRidSpecificSkipTfm.csproj b/Tests/ClasslibPackNonRidSpecificSkipTfm/ClasslibPackNonRidSpecificSkipTfm.csproj new file mode 100644 index 0000000..50ba249 --- /dev/null +++ b/Tests/ClasslibPackNonRidSpecificSkipTfm/ClasslibPackNonRidSpecificSkipTfm.csproj @@ -0,0 +1,19 @@ + + + + + + netstandard2.0 + false + + + + + + + + + + + + diff --git a/Tests/ClasslibPackNonRidSpecificSkipTfms/ClasslibPackNonRidSpecificSkipTfms.csproj b/Tests/ClasslibPackNonRidSpecificSkipTfms/ClasslibPackNonRidSpecificSkipTfms.csproj new file mode 100644 index 0000000..b9d2df6 --- /dev/null +++ b/Tests/ClasslibPackNonRidSpecificSkipTfms/ClasslibPackNonRidSpecificSkipTfms.csproj @@ -0,0 +1,19 @@ + + + + + + netstandard2.0 + false + + + + + + + + + + + + diff --git a/Tests/ClasslibPackRidSpecificCustomTfm/ClasslibPackRidSpecificCustomTfm.csproj b/Tests/ClasslibPackRidSpecificCustomTfm/ClasslibPackRidSpecificCustomTfm.csproj new file mode 100644 index 0000000..73b1245 --- /dev/null +++ b/Tests/ClasslibPackRidSpecificCustomTfm/ClasslibPackRidSpecificCustomTfm.csproj @@ -0,0 +1,52 @@ + + + + + + netstandard2.0 + win;unix + true + IncludeDefaultProjectBuildOutputInPack + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/ClasslibPackRidSpecificCustomTfms/ClasslibPackRidSpecificCustomTfms.csproj b/Tests/ClasslibPackRidSpecificCustomTfms/ClasslibPackRidSpecificCustomTfms.csproj new file mode 100644 index 0000000..eb0bd16 --- /dev/null +++ b/Tests/ClasslibPackRidSpecificCustomTfms/ClasslibPackRidSpecificCustomTfms.csproj @@ -0,0 +1,52 @@ + + + + + + netstandard2.0 + win;unix + true + IncludeDefaultProjectBuildOutputInPack + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/ClasslibPackRidSpecificDefaultTfm/ClasslibPackRidSpecificDefaultTfm.csproj b/Tests/ClasslibPackRidSpecificDefaultTfm/ClasslibPackRidSpecificDefaultTfm.csproj new file mode 100644 index 0000000..52201c2 --- /dev/null +++ b/Tests/ClasslibPackRidSpecificDefaultTfm/ClasslibPackRidSpecificDefaultTfm.csproj @@ -0,0 +1,51 @@ + + + + + + netstandard2.0 + win;unix + true + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/ClasslibPackRidSpecificDefaultTfms/ClasslibPackRidSpecificDefaultTfms.csproj b/Tests/ClasslibPackRidSpecificDefaultTfms/ClasslibPackRidSpecificDefaultTfms.csproj new file mode 100644 index 0000000..99e8110 --- /dev/null +++ b/Tests/ClasslibPackRidSpecificDefaultTfms/ClasslibPackRidSpecificDefaultTfms.csproj @@ -0,0 +1,51 @@ + + + + + + netstandard2.0 + win;unix + true + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/ClasslibPackRidSpecificSkipTfm/ClasslibPackRidSpecificSkipTfm.csproj b/Tests/ClasslibPackRidSpecificSkipTfm/ClasslibPackRidSpecificSkipTfm.csproj new file mode 100644 index 0000000..266ac7a --- /dev/null +++ b/Tests/ClasslibPackRidSpecificSkipTfm/ClasslibPackRidSpecificSkipTfm.csproj @@ -0,0 +1,40 @@ + + + + + + netstandard2.0 + win;unix + true + false + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/ClasslibPackRidSpecificSkipTfms/ClasslibPackRidSpecificSkipTfms.csproj b/Tests/ClasslibPackRidSpecificSkipTfms/ClasslibPackRidSpecificSkipTfms.csproj new file mode 100644 index 0000000..07de9d4 --- /dev/null +++ b/Tests/ClasslibPackRidSpecificSkipTfms/ClasslibPackRidSpecificSkipTfms.csproj @@ -0,0 +1,40 @@ + + + + + + netstandard2.0 + win;unix + true + false + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/ClasslibPackTests.msbuildproj b/Tests/ClasslibPackTests.msbuildproj new file mode 100644 index 0000000..4c85996 --- /dev/null +++ b/Tests/ClasslibPackTests.msbuildproj @@ -0,0 +1,60 @@ + + + + ErrorAndContinue + + + + + Configuration=$(Configuration) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/Directory.Build.props b/Tests/Directory.Build.props new file mode 100644 index 0000000..d8ad782 --- /dev/null +++ b/Tests/Directory.Build.props @@ -0,0 +1,7 @@ + + + + true + + + \ No newline at end of file diff --git a/Tests/Directory.Build.targets b/Tests/Directory.Build.targets index c9129e2..f95c31b 100644 --- a/Tests/Directory.Build.targets +++ b/Tests/Directory.Build.targets @@ -1,7 +1,46 @@ - - - + + + + + + + + true + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file