Install any skill in seconds. Free to start, no credit card required.
Get Started Free →dotnet/extension-points
Guide for MSBuild extensibility: CustomBefore/CustomAfter hooks, wildcard imports with alphabetic ordering, import gating with control properties, NuGet package build extension layout (build/buildTransitive), and the MicrosoftCommonPropsHasBeenImported guard. USE FOR: diagnosing and fixing MSBuild import and hook patterns, reviewing and fixing extension point anti-patterns in Directory.Build files, fixing missing Exists() guards on imports that break fresh clones, fixing NuGet package hooks bein
Passed 22 of 22 test cases with the skill, and 20 of 22 without it.
and 1 more in the full report
2 fixed20 passed either way0 still failing0 broke
Tokens, turns and time describe resource use, not a dollar price.
One of 2 test cases the skill fixed. Same model, same prompt, with and without the skill.
I am packaging a multi-targeted NuGet tool called DataSync.Engine with props and targets in both build/ and buildTransitive/ folders per TFM. How should I structure the import logic inside buildTransitive/<tfm>/DataSync.Engine.props so it safely delegates to the corresponding file in build/ across transitive projects without breaking during restore or target evaluation? Please provide the exact MSBuild XML snippet for the transitive props file and explain the path resolution pattern.
| Checked | Without skill | With skill |
|---|---|---|
| The response uses GetFileName and GetDirectoryName on MSBuildThisFileDirectory to derive the TFM folder name rather than using TargetFramework. | Missed | Passed |
| The response does not add an Exists condition to the package import tag. | Missed | Passed |
The instructions your model reads when the skill loads.
How the MSBuild pipeline provides hooks for SDKs, NuGet packages, repos, and users to inject custom logic.
Every major .targets file defines import hooks:
<PropertyGroup>
<CustomBeforeMicrosoftCommonTargets Condition="'$(CustomBeforeMicrosoftCommonTargets)' == ''">
$(MSBuildExtensionsPath)\v$(MSBuildToolsVersion)\Custom.Before.Microsoft.Common.targets
</CustomBeforeMicrosoftCommonTargets>
</PropertyGroup>
<Import Project="$(CustomBeforeMicrosoftCommonTargets)"
Condition="'$(CustomBeforeMicrosoftCommonTargets)' != '' and Exists('$(CustomBeforeMicrosoftCommonTargets)')"/>
<!-- ... core targets ... -->
<Import Project="$(CustomAfterMicrosoftCommonTargets)"
Condition="'$(CustomAfterMicrosoftCommonTargets)' != '' and Exists('$(CustomAfterMicrosoftCommonTargets)')"/>
v$(MSBuildToolsVersion)) for side-by-side installations.Exists(). The file may not be present on every machine.<PropertyGroup>
<CustomBeforeMicrosoftCommonTargets>
$(CustomBeforeMicrosoftCommonTargets);$(MSBuildThisFileDirectory)MyExtension.targets
</CustomBeforeMicrosoftCommonTargets>
</PropertyGroup>
MSBuild imports all files in extension directories, sorted alphabetically:
test cases passed, vs 20 / 22 without
More skills from the same source and nearby in the registry, with their headline benchmark lift.