Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,3 @@ updates:
- dependency-name: Microsoft.Extensions.*
update-types:
- version-update:semver-major

- package-ecosystem: gitsubmodule
directory: /
schedule:
interval: weekly
4 changes: 0 additions & 4 deletions .gitmodules

This file was deleted.

1 change: 0 additions & 1 deletion .msbuild
Submodule .msbuild deleted from f62e88

This file was deleted.

This file was deleted.

6 changes: 6 additions & 0 deletions .toolkit/kit.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"repository": "DragoAnt/MSBuildKit",
"version": "0.1.1",
"sha256": "a16b4320b85318ed187b040a6d078e80587c201e918aaadea17f1a7af759c71e",
"parts": ["PackageAsProj"]
}
20 changes: 20 additions & 0 deletions .toolkit/kit.parts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# DragoAnt.MSBuildKit parts: <name> <default|optional> [required parts...]
# The folder of a part is msbuild/DragoAnt.MSBuildKit.<name> ("Trunk" is msbuild/DragoAnt.MSBuildKit).
Core default
Trunk default
Vcs.GitHub default
TfmConstants default
Packaging default
Testing default
Testing.XUnit.v3 default Testing
Locals.Compile default
Locals.DirectorySecrets default
Locals.Secrets default
PrivateAssets default
Project.RoslynComponent optional
Project.CodeAnalyzer optional Project.RoslynComponent
Project.CodeFixer optional Project.RoslynComponent Project.CodeAnalyzer
Project.SourceGenerator optional Project.RoslynComponent
PackageAsProj optional
ProjMetadata optional
EF optional
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<Project>

<!-- MSKIT_CORE001: the project name matched more than one auto-detect regex. -->
<Target Name="ValidateAutoDetectedProjectTypeMutex"
BeforeTargets="CoreCompile;Build"
Condition="@(MSKit_AutoDetectedProjectType-&gt;Count()) &gt; 1">
<PropertyGroup>
<_MSKit_AutoDetectedTypes>@(MSKit_AutoDetectedProjectType, ', ')</_MSKit_AutoDetectedTypes>
</PropertyGroup>
<Error Code="MSKIT_CORE001"
File="$(MSBuildProjectFullPath)"
Text="Project '$(MSBuildProjectName)' auto-detected as MULTIPLE project types: $(_MSKit_AutoDetectedTypes).%0AA project can be exactly ONE type.%0AFix ONE of:%0A 1. Rename the project so its name matches only ONE auto-detect regex%0A 2. Override the conflicting MSKit_*ProjectNameRegex in Directory.Build.props to exclude this project name%0A 3. Set the corresponding MSKit_Disable*AutoDetect=true in the csproj and import the explicit endpoint instead (e.g. MSKit_DisableCodeAnalyzerAutoDetect=true + Import &quot;$(CodeAnalyzerCommonPropsPath)&quot;)" />
</Target>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<Project>

<!-- MSKIT_ROSLYN001..003: a project name matched a Roslyn auto-detect regex, but the kit part
that wires that project type is not installed. -->

<Target Name="ValidateCodeAnalyzerSatelliteAttached"
BeforeTargets="CoreCompile;Build"
Condition="'$(MSKit_IsCodeAnalyzerAutoDetected)'=='True'
AND '$(MSKit_CodeAnalyzerSatelliteAttached)'!='true'">
<Error Code="MSKIT_ROSLYN001"
File="$(MSBuildProjectFullPath)"
Text="Project '$(MSBuildProjectName)' name matches the CodeAnalyzer auto-detect regex '$(_MSKit_CodeAnalyzerProjectNameRegex_Shared)' but the kit part 'DragoAnt.MSBuildKit.Project.CodeAnalyzer' is not installed.%0AFix: pwsh .toolkit/update.ps1 -Add Project.CodeAnalyzer (or: sh .toolkit/update.sh --add Project.CodeAnalyzer)%0AOr, if this project is not a Roslyn analyzer, rename it or set MSKit_DisableCodeAnalyzerAutoDetect=true in the csproj." />
</Target>

<Target Name="ValidateCodeFixerSatelliteAttached"
BeforeTargets="CoreCompile;Build"
Condition="'$(MSKit_IsCodeFixerAutoDetected)'=='True'
AND '$(MSKit_CodeFixerSatelliteAttached)'!='true'">
<Error Code="MSKIT_ROSLYN002"
File="$(MSBuildProjectFullPath)"
Text="Project '$(MSBuildProjectName)' name matches the CodeFixer auto-detect regex '$(_MSKit_CodeFixerProjectNameRegex_Shared)' but the kit part 'DragoAnt.MSBuildKit.Project.CodeFixer' is not installed.%0AFix: pwsh .toolkit/update.ps1 -Add Project.CodeFixer (or: sh .toolkit/update.sh --add Project.CodeFixer)%0AOr, if this project is not a Roslyn code-fix provider, rename it or set MSKit_DisableCodeFixerAutoDetect=true in the csproj." />
</Target>

<Target Name="ValidateSourceGeneratorSatelliteAttached"
BeforeTargets="CoreCompile;Build"
Condition="'$(MSKit_IsSourceGeneratorAutoDetected)'=='True'
AND '$(MSKit_SourceGeneratorSatelliteAttached)'!='true'">
<Error Code="MSKIT_ROSLYN003"
File="$(MSBuildProjectFullPath)"
Text="Project '$(MSBuildProjectName)' name matches the SourceGenerator auto-detect regex '$(_MSKit_SourceGeneratorProjectNameRegex_Shared)' but the kit part 'DragoAnt.MSBuildKit.Project.SourceGenerator' is not installed.%0AFix: pwsh .toolkit/update.ps1 -Add Project.SourceGenerator (or: sh .toolkit/update.sh --add Project.SourceGenerator)%0AOr, if this project is not a Roslyn source generator, rename it or set MSKit_DisableSourceGeneratorAutoDetect=true in the csproj." />
</Target>

</Project>
32 changes: 32 additions & 0 deletions .toolkit/msbuild/DragoAnt.MSBuildKit.Core/core.common.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<Project>

<PropertyGroup>
<MSKit_Diagnostic Condition="'$(MSKit_Diagnostic)'==''">false</MSKit_Diagnostic>
<!-- True on a developer machine; the Vcs.GitHub part flips it to False on GitHub Actions. -->
<MSKit_IsDevEnv Condition="'$(MSKit_IsDevEnv)'==''">True</MSKit_IsDevEnv>

<!-- A Version that exists before the kit loads (-p:Version=... or Directory.Build.props
above the import) is the caller's decision: the version engine then renders nothing. -->
<MSKit_ExplicitVersion Condition="'$(MSKit_ExplicitVersion)'==''">$(Version)</MSKit_ExplicitVersion>

<MSKit_ImplicitPackageVersions Condition="'$(MSKit_ImplicitPackageVersions)'==''">True</MSKit_ImplicitPackageVersions>

<MSKit_Templates Condition="'$(MSKit_Templates)'==''">$(MSBuildThisFileDirectory)../../.local/</MSKit_Templates>

<MSKit_SlnFileDirectory Condition="'$(MSKit_SlnFileDirectory)'=='' AND '$(SlnxFilePath)'!=''">$([System.IO.Path]::GetDirectoryName('$(SlnxFilePath)').Replace('\', '/').TrimEnd('/'))/</MSKit_SlnFileDirectory>
<MSKit_SlnFileDirectory Condition="'$(MSKit_SlnFileDirectory)'==''">$(MSBuildThisFileDirectory)../../../</MSKit_SlnFileDirectory>
<MSKit_SlnFileDirectory>$([System.IO.Path]::GetFullPath('$(MSKit_SlnFileDirectory)').Replace('\', '/').TrimEnd('/'))/</MSKit_SlnFileDirectory>

<MSKit_SlnFileName Condition="'$(MSKit_SlnFileName)'=='' AND '$(SlnxFilePath)'!=''">$([System.IO.Path]::GetFileNameWithoutExtension('$(SlnxFilePath)'))</MSKit_SlnFileName>

<MSKit_ToolkitMSBuildDir Condition="'$(MSKit_ToolkitMSBuildDir)'==''">$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)../').Replace('\', '/').TrimEnd('/'))/</MSKit_ToolkitMSBuildDir>
<MSKit_ToolkitDir Condition="'$(MSKit_ToolkitDir)'==''">$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)../../').Replace('\', '/').TrimEnd('/'))/</MSKit_ToolkitDir>

<_ProjectObjDir>$(BaseIntermediateOutputPath)</_ProjectObjDir>
<_ProjectObjDir Condition="'$(_ProjectObjDir)'==''">obj</_ProjectObjDir>
<MSKit_ProjectObjDir Condition="$([System.IO.Path]::IsPathRooted('$(_ProjectObjDir)'))">$(_ProjectObjDir)</MSKit_ProjectObjDir>
<MSKit_ProjectObjDir Condition="'$(MSKit_ProjectObjDir)'==''">$([System.IO.Path]::GetFullPath('$(MSBuildProjectDirectory)/$(_ProjectObjDir)'))</MSKit_ProjectObjDir>
<MSKit_ProjectObjDir>$([System.IO.Path]::GetFullPath('$(MSKit_ProjectObjDir)').TrimEnd('/').Replace('\', '/'))</MSKit_ProjectObjDir>
</PropertyGroup>

</Project>
8 changes: 8 additions & 0 deletions .toolkit/msbuild/DragoAnt.MSBuildKit.Core/core.locals.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<Project>

<PropertyGroup>
<MSKit_LocalSecretsBaseDirectory Condition="'$(MSKit_LocalSecretsBaseDirectory)'=='' AND $([MSBuild]::IsOsPlatform('Windows'))">$([System.Environment]::GetFolderPath(SpecialFolder.ApplicationData))\Microsoft\UserSecrets\</MSKit_LocalSecretsBaseDirectory>
<MSKit_LocalSecretsBaseDirectory Condition="'$(MSKit_LocalSecretsBaseDirectory)'=='' AND ($([MSBuild]::IsOsPlatform('Linux')) OR $([MSBuild]::IsOsPlatform('OSX')))">$([System.Environment]::GetFolderPath(SpecialFolder.UserProfile))/.microsoft/usersecrets/</MSKit_LocalSecretsBaseDirectory>
</PropertyGroup>

</Project>
8 changes: 8 additions & 0 deletions .toolkit/msbuild/DragoAnt.MSBuildKit.Core/core.locals.targets
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<Project>

<!-- UserSecretsId is set in the csproj, after every props file, so this lives in targets. -->
<PropertyGroup Condition="'$(UserSecretsId)'!=''">
<LocalSecretsDir Condition="'$(LocalSecretsDir)'==''">$(MSKit_LocalSecretsBaseDirectory)$(UserSecretsId)</LocalSecretsDir>
</PropertyGroup>

</Project>
29 changes: 29 additions & 0 deletions .toolkit/msbuild/DragoAnt.MSBuildKit.Core/git.root.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<Project>

<!-- GitHub Actions checks out tags and pull requests detached, so .git/HEAD holds a SHA there:
the CI ref name wins over the local HEAD whenever Actions is running. -->
<PropertyGroup Condition="'$(MSKit_Branch)'=='' AND '$(GITHUB_ACTIONS)'=='true' AND '$(GITHUB_HEAD_REF)'!=''">
<MSKit_Branch>$(GITHUB_HEAD_REF)</MSKit_Branch>
</PropertyGroup>
<PropertyGroup Condition="'$(MSKit_Branch)'=='' AND '$(GITHUB_ACTIONS)'=='true' AND '$(GITHUB_REF_NAME)'!=''">
<MSKit_Branch>$(GITHUB_REF_NAME)</MSKit_Branch>
</PropertyGroup>

<PropertyGroup>
<MSKit_GitRoot Condition="'$(MSKit_GitRoot)'==''">$([MSBuild]::GetDirectoryNameOfFileAbove('$(MSBuildProjectDirectory)', '.git'))</MSKit_GitRoot>
<MSKit_GitRoot Condition="'$(MSKit_GitRoot)'==''">$([MSBuild]::GetDirectoryNameOfFileAbove('$(MSBuildProjectDirectory)', '.git/HEAD'))</MSKit_GitRoot>
</PropertyGroup>

<PropertyGroup Condition="'$(MSKit_GitRoot)'!=''">
<_MSKit_GitHeadFile Condition="Exists('$(MSKit_GitRoot)/.git/HEAD')">$(MSKit_GitRoot)/.git/HEAD</_MSKit_GitHeadFile>
<!-- In a git worktree .git is a file pointing at the worktree's own git dir. -->
<_MSKit_GitDirPointer Condition="'$(_MSKit_GitHeadFile)'=='' AND Exists('$(MSKit_GitRoot)/.git')">$([System.IO.File]::ReadAllText('$(MSKit_GitRoot)/.git').Trim().Replace('gitdir: ', ''))</_MSKit_GitDirPointer>
<_MSKit_GitDirPointer Condition="'$(_MSKit_GitDirPointer)'!='' AND !$([System.IO.Path]::IsPathRooted('$(_MSKit_GitDirPointer)'))">$(MSKit_GitRoot)/$(_MSKit_GitDirPointer)</_MSKit_GitDirPointer>
<_MSKit_GitHeadFile Condition="'$(_MSKit_GitDirPointer)'!='' AND Exists('$(_MSKit_GitDirPointer)/HEAD')">$(_MSKit_GitDirPointer)/HEAD</_MSKit_GitHeadFile>
</PropertyGroup>

<PropertyGroup Condition="'$(MSKit_Branch)'=='' AND '$(_MSKit_GitHeadFile)'!=''">
<MSKit_Branch>$([System.IO.File]::ReadAllText('$(_MSKit_GitHeadFile)').Trim().Replace('ref: refs/heads/', ''))</MSKit_Branch>
</PropertyGroup>

</Project>
12 changes: 12 additions & 0 deletions .toolkit/msbuild/DragoAnt.MSBuildKit.Core/git.routine.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<Project>

<PropertyGroup>
<MSKit_Branch Condition="'$(MSKit_Branch)'=='' AND '$(GITHUB_REF_NAME)'!=''">$(GITHUB_REF_NAME)</MSKit_Branch>
<MSKit_Branch Condition="'$(MSKit_Branch)'==''">unknown-branch</MSKit_Branch>
<MSKit_CommitSha Condition="'$(MSKit_CommitSha)'==''"></MSKit_CommitSha>
<MSKit_IsStableBranchRegex Condition="'$(MSKit_IsStableBranchRegex)'==''">^(main|master|release/.+)$</MSKit_IsStableBranchRegex>
<MSKit_IsStableBranch>false</MSKit_IsStableBranch>
<MSKit_IsStableBranch Condition="$([System.Text.RegularExpressions.Regex]::IsMatch($(MSKit_Branch), $(MSKit_IsStableBranchRegex), RegexOptions.IgnoreCase))">true</MSKit_IsStableBranch>
</PropertyGroup>

</Project>
10 changes: 10 additions & 0 deletions .toolkit/msbuild/DragoAnt.MSBuildKit.Core/init.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<Project>

<Import Project="$(MSBuildThisFileDirectory)core.common.props" />
<Import Project="$(MSBuildThisFileDirectory)git.root.props" />
<Import Project="$(MSBuildThisFileDirectory)git.routine.props" />
<Import Project="$(MSBuildThisFileDirectory)tfm.routine.props" />
<Import Project="$(MSBuildThisFileDirectory)core.locals.props" />
<Import Project="$(MSBuildThisFileDirectory)project-types.autodetect.props" />

</Project>
5 changes: 5 additions & 0 deletions .toolkit/msbuild/DragoAnt.MSBuildKit.Core/init.targets
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<Project>

<Import Project="$(MSBuildThisFileDirectory)core.locals.targets" />

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<Project>

<!-- Filename-based detection of Roslyn project types. Override a regex in Directory.Build.props,
or turn detection off with MSKit_Disable<Type>AutoDetect=true and import the matching
$(<Type>CommonPropsPath) explicitly. The lookbehind keeps the kit's own part names from
matching themselves. -->
<PropertyGroup>
<MSKit_CodeAnalyzerProjectNameRegex Condition="'$(MSKit_CodeAnalyzerProjectNameRegex)'==''">(?&lt;!^DragoAnt\.MSBuildKit\.Project)\.Analyzers$</MSKit_CodeAnalyzerProjectNameRegex>
<MSKit_CodeFixerProjectNameRegex Condition="'$(MSKit_CodeFixerProjectNameRegex)'==''">(?&lt;!^DragoAnt\.MSBuildKit\.Project)\.CodeFixes$</MSKit_CodeFixerProjectNameRegex>
<MSKit_SourceGeneratorProjectNameRegex Condition="'$(MSKit_SourceGeneratorProjectNameRegex)'==''">(?&lt;!^DragoAnt\.MSBuildKit\.Project)\.SourceGenerator$</MSKit_SourceGeneratorProjectNameRegex>
</PropertyGroup>

<PropertyGroup>
<MSKit_IsCodeAnalyzerAutoDetected Condition="'$(MSKit_IsCodeAnalyzerAutoDetected)'==''
AND '$(IsCodeAnalyzer)'==''
AND '$(MSKit_DisableCodeAnalyzerAutoDetect)'!='true'
AND '$(MSKit_CodeAnalyzerProjectNameRegex)'!=''">$([System.Text.RegularExpressions.Regex]::IsMatch($(MSBuildProjectName), $(MSKit_CodeAnalyzerProjectNameRegex)))</MSKit_IsCodeAnalyzerAutoDetected>
<IsCodeAnalyzer Condition="'$(IsCodeAnalyzer)'=='' AND '$(MSKit_IsCodeAnalyzerAutoDetected)'=='True'">True</IsCodeAnalyzer>

<MSKit_IsCodeFixerAutoDetected Condition="'$(MSKit_IsCodeFixerAutoDetected)'==''
AND '$(IsCodeFixer)'==''
AND '$(MSKit_DisableCodeFixerAutoDetect)'!='true'
AND '$(MSKit_CodeFixerProjectNameRegex)'!=''">$([System.Text.RegularExpressions.Regex]::IsMatch($(MSBuildProjectName), $(MSKit_CodeFixerProjectNameRegex)))</MSKit_IsCodeFixerAutoDetected>
<IsCodeFixer Condition="'$(IsCodeFixer)'=='' AND '$(MSKit_IsCodeFixerAutoDetected)'=='True'">True</IsCodeFixer>

<MSKit_IsSourceGeneratorAutoDetected Condition="'$(MSKit_IsSourceGeneratorAutoDetected)'==''
AND '$(IsSourceGenerator)'==''
AND '$(MSKit_DisableSourceGeneratorAutoDetect)'!='true'
AND '$(MSKit_SourceGeneratorProjectNameRegex)'!=''">$([System.Text.RegularExpressions.Regex]::IsMatch($(MSBuildProjectName), $(MSKit_SourceGeneratorProjectNameRegex)))</MSKit_IsSourceGeneratorAutoDetected>
<IsSourceGenerator Condition="'$(IsSourceGenerator)'=='' AND '$(MSKit_IsSourceGeneratorAutoDetected)'=='True'">true</IsSourceGenerator>
</PropertyGroup>

<!-- Snapshots of the regexes the detection used; audits read these, not a later csproj override. -->
<PropertyGroup>
<_MSKit_CodeAnalyzerProjectNameRegex_Shared>$(MSKit_CodeAnalyzerProjectNameRegex)</_MSKit_CodeAnalyzerProjectNameRegex_Shared>
<_MSKit_CodeFixerProjectNameRegex_Shared>$(MSKit_CodeFixerProjectNameRegex)</_MSKit_CodeFixerProjectNameRegex_Shared>
<_MSKit_SourceGeneratorProjectNameRegex_Shared>$(MSKit_SourceGeneratorProjectNameRegex)</_MSKit_SourceGeneratorProjectNameRegex_Shared>
</PropertyGroup>

<ItemGroup>
<MSKit_AutoDetectedProjectType Include="CodeAnalyzer" Condition="'$(MSKit_IsCodeAnalyzerAutoDetected)'=='True'" />
<MSKit_AutoDetectedProjectType Include="CodeFixer" Condition="'$(MSKit_IsCodeFixerAutoDetected)'=='True'" />
<MSKit_AutoDetectedProjectType Include="SourceGenerator" Condition="'$(MSKit_IsSourceGeneratorAutoDetected)'=='True'" />
</ItemGroup>

</Project>
42 changes: 42 additions & 0 deletions .toolkit/msbuild/DragoAnt.MSBuildKit.Core/tfm.routine.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<Project>

<!-- Lets a csproj switch between TargetFramework and TargetFrameworks against a shared value in
Directory.Build.props. It runs in props because the SDK locks IsCrossTargetingBuild before
the targets phase. The DBP text is read directly, because Pack re-evaluates each inner build
with TargetFramework as a global property, which looks exactly like a DBP declaration. -->
<PropertyGroup>
<_MSKit_DbpFilePath>$([MSBuild]::GetPathOfFileAbove('Directory.Build.props'))</_MSKit_DbpFilePath>
<_MSKit_DbpText Condition="'$(_MSKit_DbpFilePath)' != '' AND Exists('$(_MSKit_DbpFilePath)')">$([System.IO.File]::ReadAllText('$(_MSKit_DbpFilePath)'))</_MSKit_DbpText>

<_MSKit_DbpHasTargetFramework Condition="'$(_MSKit_DbpText)' != '' AND ($(_MSKit_DbpText.Contains('&lt;TargetFramework&gt;')) OR $(_MSKit_DbpText.Contains('&lt;TargetFramework ')))">True</_MSKit_DbpHasTargetFramework>
<_MSKit_DbpHasTargetFrameworks Condition="'$(_MSKit_DbpText)' != '' AND ($(_MSKit_DbpText.Contains('&lt;TargetFrameworks&gt;')) OR $(_MSKit_DbpText.Contains('&lt;TargetFrameworks ')))">True</_MSKit_DbpHasTargetFrameworks>

<MSKit_TargetFramework_Shared Condition="'$(_MSKit_DbpHasTargetFramework)' == 'True'">$([System.Text.RegularExpressions.Regex]::Match($(_MSKit_DbpText), '&lt;TargetFramework[^&gt;/]*&gt;([^&lt;]*)&lt;/TargetFramework&gt;').Groups[1].Value)</MSKit_TargetFramework_Shared>
<MSKit_TargetFrameworks_Shared Condition="'$(_MSKit_DbpHasTargetFrameworks)' == 'True'">$([System.Text.RegularExpressions.Regex]::Match($(_MSKit_DbpText), '&lt;TargetFrameworks[^&gt;/]*&gt;([^&lt;]*)&lt;/TargetFrameworks&gt;').Groups[1].Value)</MSKit_TargetFrameworks_Shared>
</PropertyGroup>

<!-- A text precheck keeps the regex off projects that declare neither element.
MSKit_GuardXmlPeekRoutine=False disables it. -->
<PropertyGroup>
<_MSKit_GuardXmlPeekRoutine Condition="'$(MSKit_GuardXmlPeekRoutine)'!='False'">True</_MSKit_GuardXmlPeekRoutine>
<_MSKit_CsprojText Condition="'$(_MSKit_GuardXmlPeekRoutine)'=='True' AND '$(_MSKit_CsprojText)'==''">$([System.IO.File]::ReadAllText('$(MSBuildProjectFullPath)'))</_MSKit_CsprojText>
<_MSKit_RoutineHasTargetFramework Condition="'$(_MSKit_GuardXmlPeekRoutine)'!='True'">True</_MSKit_RoutineHasTargetFramework>
<_MSKit_RoutineHasTargetFramework Condition="'$(_MSKit_GuardXmlPeekRoutine)'=='True' AND ($(_MSKit_CsprojText.Contains('&lt;TargetFramework&gt;')) OR $(_MSKit_CsprojText.Contains('&lt;TargetFramework ')))">True</_MSKit_RoutineHasTargetFramework>
<_MSKit_RoutineHasTargetFrameworks Condition="'$(_MSKit_GuardXmlPeekRoutine)'!='True'">True</_MSKit_RoutineHasTargetFrameworks>
<_MSKit_RoutineHasTargetFrameworks Condition="'$(_MSKit_GuardXmlPeekRoutine)'=='True' AND ($(_MSKit_CsprojText.Contains('&lt;TargetFrameworks&gt;')) OR $(_MSKit_CsprojText.Contains('&lt;TargetFrameworks ')))">True</_MSKit_RoutineHasTargetFrameworks>
</PropertyGroup>

<PropertyGroup>
<MSKit_TargetFramework_Proj Condition="'$(_MSKit_RoutineHasTargetFramework)'=='True'">$([System.Text.RegularExpressions.Regex]::Match($(_MSKit_CsprojText), '&lt;TargetFramework[^&gt;/]*&gt;([^&lt;]*)&lt;/TargetFramework&gt;').Groups[1].Value)</MSKit_TargetFramework_Proj>
<MSKit_TargetFrameworks_Proj Condition="'$(_MSKit_RoutineHasTargetFrameworks)'=='True'">$([System.Text.RegularExpressions.Regex]::Match($(_MSKit_CsprojText), '&lt;TargetFrameworks[^&gt;/]*&gt;([^&lt;]*)&lt;/TargetFrameworks&gt;').Groups[1].Value)</MSKit_TargetFrameworks_Proj>
</PropertyGroup>

<!-- The csproj declares only one shape: clear the shared value of the other shape. -->
<PropertyGroup Condition="'$(MSKit_TargetFrameworks_Proj)'!='' AND '$(MSKit_TargetFramework_Proj)'=='' AND '$(MSKit_TargetFramework_Shared)'!=''">
<TargetFramework></TargetFramework>
</PropertyGroup>
<PropertyGroup Condition="'$(MSKit_TargetFramework_Proj)'!='' AND '$(MSKit_TargetFrameworks_Proj)'=='' AND '$(MSKit_TargetFrameworks_Shared)'!=''">
<TargetFrameworks></TargetFrameworks>
</PropertyGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<Project>
<Import Project="$(MSBuildThisFileDirectory)local.compile.props" />
</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<Project>
<Import Project="$(MSBuildThisFileDirectory)local.compile.targets" />
</Project>
Loading