π§ MSBuild File Quality Report β 2026-09-30
Files reviewed: 96
New findings: π΄ 2 errors Β· π‘ 2 warnings Β· π΅ 0 suggestions
π΄ Errors
src/FSharp.Build/Microsoft.FSharp.NetSdk.props
- Rule B-1:
ValueTupleImplicitPackageVersion is consumed before its default is assigned, and the later unconditional assignment overwrites consumer/repository choices.
- Lines: 87β97
- Current:
<ItemGroup Condition="...">
<PackageReference Include="System.ValueTuple" Version="$(ValueTupleImplicitPackageVersion)" />
</ItemGroup>
<PropertyGroup>
<ValueTupleImplicitPackageVersion>4.6.2</ValueTupleImplicitPackageVersion>
</PropertyGroup>
- Impact: For consumer projects targeting .NET Standard/.NET Core below 2.0, the package item is evaluated before the default exists and can receive an empty version. A value supplied by the project is also replaced before the later .NET Framework package item is evaluated.
- Suggested:
<PropertyGroup>
<ValueTupleImplicitPackageVersion Condition="'$(ValueTupleImplicitPackageVersion)' == ''">4.6.2</ValueTupleImplicitPackageVersion>
</PropertyGroup>
<ItemGroup Condition="...">
<PackageReference Include="System.ValueTuple" Version="$(ValueTupleImplicitPackageVersion)" />
</ItemGroup>
eng/Packages.props
- Rule B-1: The three computed central package-version floors are never consumed.
- Lines: 12β17, 111, 116, 118
- Current:
<SystemCollectionsImmutableCentralVersion>...</SystemCollectionsImmutableCentralVersion>
<SystemReflectionMetadataCentralVersion>...</SystemReflectionMetadataCentralVersion>
<SystemSecurityCryptographyXmlCentralVersion>...</SystemSecurityCryptographyXmlCentralVersion>
<PackageVersion Include="System.Collections.Immutable" Version="$(SystemCollectionsImmutableVersion)" />
<PackageVersion Include="System.Reflection.Metadata" Version="$(SystemReflectionMetadataVersion)" />
<PackageVersion Include="System.Security.Cryptography.Xml" Version="$(SystemSecurityCryptographyXmlVersion)" />
- Impact: The documented
10.0.9 floor is ineffective, retaining the CPM downgrade/prebuilt-package risk that the surrounding comment says these aliases are intended to prevent.
- Suggested:
<PackageVersion Include="System.Collections.Immutable" Version="$(SystemCollectionsImmutableCentralVersion)" />
<PackageVersion Include="System.Reflection.Metadata" Version="$(SystemReflectionMetadataCentralVersion)" />
<PackageVersion Include="System.Security.Cryptography.Xml" Version="$(SystemSecurityCryptographyXmlCentralVersion)" />
π‘ Warnings
FSharpBuild.Directory.Build.targets
- Rule A-3: The incremental resource comparison hashes an undefined item instead of the files collected immediately above it.
- Lines: 131β155
- Current:
<IntermediateResourcesFiles Include="$(IntermediateOutputPath)resources\*.resx" />
...
<GetFileHash Files="@(IntermediateResourceFilesForHash)">
- Impact:
@(IntermediateResourceFilesForHash) is never populated, so IntermediateResourceFilesHash is based on an empty item list and the target cannot correctly determine whether transformed resources changed.
- Suggested:
<GetFileHash Files="@(IntermediateResourcesFiles)">
vsintegration/tests/MockTypeProviders/Directory.Build.props
- Rule B-3: The test-specific
NoWarn assignment discards inherited suppressions.
- Line: 13
- Current:
<NoWarn>0067;0169;1591</NoWarn>
- Suggested:
<NoWarn>$(NoWarn);0067;0169;1591</NoWarn>
π΅ Suggestions
None.
Existing issue #20357 already tracks the CreateManifestResourceNamesDependsOn overwrite, missing FileWrites registration for ILLink substitutions, and stale shim fallback. Those unchanged findings are intentionally not duplicated here.
Files reviewed (no issues found)
.github/skills/fsharp-diagnostics/server/Directory.Build.props
CoordinateXliff.targets
Directory.Build.props
Directory.Build.targets
Directory.Packages.props
FSharp.Profiles.props
FSharpBuild.Directory.Build.props
FSharpTests.Directory.Build.props
FSharpTests.Directory.Build.targets
UseLocalCompiler.Directory.Build.props
UseLocalCompiler.Directory.Build.targets
buildtools/buildtools.targets
buildtools/checkpackages/Directory.Build.props
buildtools/checkpackages/Directory.Build.targets
docs/fcs-samples/Directory.Build.props
eng/Publishing.props
eng/Signing.props
eng/TargetFrameworks.props
eng/Version.Details.props
eng/Versions.props
eng/common/internal/Directory.Build.props
eng/common/native/LocateNativeCompiler.targets
eng/common/native/NativeAotSupported.props
eng/restore/optimizationData.targets
eng/targets/Imports.targets
eng/targets/NuGet.targets
eng/targets/Settings.props
setup/Directory.Build.props
setup/Swix/Directory.Build.props
setup/Swix/Directory.Build.targets
src/Compiler/Directory.Build.props
src/Directory.Build.props
src/Directory.Build.targets
src/FSharp.Build/Directory.Build.props
src/FSharp.Build/Microsoft.FSharp.Core.NetSdk.props
src/FSharp.Build/Microsoft.FSharp.Overrides.NetSdk.targets
src/FSharp.Build/Microsoft.Portable.FSharp.Targets
src/FSharp.Compiler.Interactive.Settings/Directory.Build.props
src/FSharp.Core/Directory.Build.props
src/Microsoft.FSharp.Compiler/Directory.Build.props
src/fsc/Directory.Build.props
src/fsc/fsc.targets
src/fsi/Directory.Build.props
src/fsi/fsi.targets
tests/AheadOfTime/Directory.Build.props
tests/AheadOfTime/Directory.Build.targets
tests/Directory.Build.props
tests/Directory.Build.targets
tests/EndToEndBuildTests/DesignTimeProviderPackaging/Directory.Build.props
tests/EndToEndBuildTests/Directory.Build.props
tests/EndToEndBuildTests/Directory.Build.targets
tests/FSharp.Build.UnitTests/Directory.Build.props
tests/FSharp.Compiler.ComponentTests/Directory.Build.props
tests/FSharp.Compiler.Private.Scripting.UnitTests/Directory.Build.props
tests/FSharp.Compiler.Service.Tests/Directory.Build.props
tests/FSharp.Test.Utilities/Directory.Build.props
tests/Resources/Directory.Build.props
tests/Resources/Directory.Build.targets
tests/benchmarks/Directory.Build.props
tests/fsharp/Directory.Build.props
tests/fsharp/SDKTests/Directory.Build.props
tests/fsharp/SDKTests/Directory.Build.targets
tests/fsharp/SDKTests/tests/FSharpCoreVersionTest.props
tests/fsharp/SDKTests/tests/FSharpCoreVersionTest.targets
tests/fsharp/SDKTests/tests/PackageTest.props
tests/fsharp/SDKTests/tests/PackageTest.targets
tests/fsharp/SDKTests/tests/ToolsTest.props
tests/fsharp/SDKTests/tests/ToolsTest.targets
tests/projects/CompilerCompat/Directory.Build.props
vsintegration/Directory.Build.props
vsintegration/Directory.Build.targets
vsintegration/ItemTemplates/Directory.Build.props
vsintegration/ItemTemplates/Directory.Build.targets
vsintegration/ProjectTemplates/Directory.Build.props
vsintegration/ProjectTemplates/Directory.Build.targets
vsintegration/Templates.Directory.Build.props
vsintegration/Templates.Directory.Build.targets
vsintegration/Vsix/Directory.Build.props
vsintegration/Vsix/Directory.Build.targets
vsintegration/Vsix/VisualFSharpFull/VisualFSharp.Core.targets
vsintegration/shims/Microsoft.FSharp.NetSdk.Shim.props
vsintegration/shims/Microsoft.FSharp.NetSdk.Shim.targets
vsintegration/shims/Microsoft.FSharp.Overrides.NetSdk.Shim.targets
vsintegration/shims/Microsoft.FSharp.Shim.targets
vsintegration/shims/Microsoft.Portable.FSharp.Shim.targets
vsintegration/src/Directory.Build.props
vsintegration/tests/Directory.Build.props
vsintegration/tests/Directory.Build.targets
vsintegration/tests/MockTypeProviders/Directory.Build.targets
Review Rules Reference
This review checks against MSBuild canonical patterns for:
- Target authoring: DependsOn chains, Returns vs Outputs, incremental build, FileWrites
- Property patterns: Conditional defaults, quoted conditions, semicolon composition, path normalization
- Item management: Include/Remove/Update, batching, generated file placement
- Extension points: Import guards, CustomBefore/After hooks, cross-platform paths
Generated by MSBuild Quality Review
Generated by F# MSBuild File Quality Review Agent Β· gpt56 1.8M Β· β·
π§ MSBuild File Quality Report β 2026-09-30
Files reviewed: 96
New findings: π΄ 2 errors Β· π‘ 2 warnings Β· π΅ 0 suggestions
π΄ Errors
src/FSharp.Build/Microsoft.FSharp.NetSdk.propsValueTupleImplicitPackageVersionis consumed before its default is assigned, and the later unconditional assignment overwrites consumer/repository choices.eng/Packages.props10.0.9floor is ineffective, retaining the CPM downgrade/prebuilt-package risk that the surrounding comment says these aliases are intended to prevent.π‘ Warnings
FSharpBuild.Directory.Build.targets@(IntermediateResourceFilesForHash)is never populated, soIntermediateResourceFilesHashis based on an empty item list and the target cannot correctly determine whether transformed resources changed.vsintegration/tests/MockTypeProviders/Directory.Build.propsNoWarnassignment discards inherited suppressions.<NoWarn>0067;0169;1591</NoWarn><NoWarn>$(NoWarn);0067;0169;1591</NoWarn>π΅ Suggestions
None.
Files reviewed (no issues found)
.github/skills/fsharp-diagnostics/server/Directory.Build.propsCoordinateXliff.targetsDirectory.Build.propsDirectory.Build.targetsDirectory.Packages.propsFSharp.Profiles.propsFSharpBuild.Directory.Build.propsFSharpTests.Directory.Build.propsFSharpTests.Directory.Build.targetsUseLocalCompiler.Directory.Build.propsUseLocalCompiler.Directory.Build.targetsbuildtools/buildtools.targetsbuildtools/checkpackages/Directory.Build.propsbuildtools/checkpackages/Directory.Build.targetsdocs/fcs-samples/Directory.Build.propseng/Publishing.propseng/Signing.propseng/TargetFrameworks.propseng/Version.Details.propseng/Versions.propseng/common/internal/Directory.Build.propseng/common/native/LocateNativeCompiler.targetseng/common/native/NativeAotSupported.propseng/restore/optimizationData.targetseng/targets/Imports.targetseng/targets/NuGet.targetseng/targets/Settings.propssetup/Directory.Build.propssetup/Swix/Directory.Build.propssetup/Swix/Directory.Build.targetssrc/Compiler/Directory.Build.propssrc/Directory.Build.propssrc/Directory.Build.targetssrc/FSharp.Build/Directory.Build.propssrc/FSharp.Build/Microsoft.FSharp.Core.NetSdk.propssrc/FSharp.Build/Microsoft.FSharp.Overrides.NetSdk.targetssrc/FSharp.Build/Microsoft.Portable.FSharp.Targetssrc/FSharp.Compiler.Interactive.Settings/Directory.Build.propssrc/FSharp.Core/Directory.Build.propssrc/Microsoft.FSharp.Compiler/Directory.Build.propssrc/fsc/Directory.Build.propssrc/fsc/fsc.targetssrc/fsi/Directory.Build.propssrc/fsi/fsi.targetstests/AheadOfTime/Directory.Build.propstests/AheadOfTime/Directory.Build.targetstests/Directory.Build.propstests/Directory.Build.targetstests/EndToEndBuildTests/DesignTimeProviderPackaging/Directory.Build.propstests/EndToEndBuildTests/Directory.Build.propstests/EndToEndBuildTests/Directory.Build.targetstests/FSharp.Build.UnitTests/Directory.Build.propstests/FSharp.Compiler.ComponentTests/Directory.Build.propstests/FSharp.Compiler.Private.Scripting.UnitTests/Directory.Build.propstests/FSharp.Compiler.Service.Tests/Directory.Build.propstests/FSharp.Test.Utilities/Directory.Build.propstests/Resources/Directory.Build.propstests/Resources/Directory.Build.targetstests/benchmarks/Directory.Build.propstests/fsharp/Directory.Build.propstests/fsharp/SDKTests/Directory.Build.propstests/fsharp/SDKTests/Directory.Build.targetstests/fsharp/SDKTests/tests/FSharpCoreVersionTest.propstests/fsharp/SDKTests/tests/FSharpCoreVersionTest.targetstests/fsharp/SDKTests/tests/PackageTest.propstests/fsharp/SDKTests/tests/PackageTest.targetstests/fsharp/SDKTests/tests/ToolsTest.propstests/fsharp/SDKTests/tests/ToolsTest.targetstests/projects/CompilerCompat/Directory.Build.propsvsintegration/Directory.Build.propsvsintegration/Directory.Build.targetsvsintegration/ItemTemplates/Directory.Build.propsvsintegration/ItemTemplates/Directory.Build.targetsvsintegration/ProjectTemplates/Directory.Build.propsvsintegration/ProjectTemplates/Directory.Build.targetsvsintegration/Templates.Directory.Build.propsvsintegration/Templates.Directory.Build.targetsvsintegration/Vsix/Directory.Build.propsvsintegration/Vsix/Directory.Build.targetsvsintegration/Vsix/VisualFSharpFull/VisualFSharp.Core.targetsvsintegration/shims/Microsoft.FSharp.NetSdk.Shim.propsvsintegration/shims/Microsoft.FSharp.NetSdk.Shim.targetsvsintegration/shims/Microsoft.FSharp.Overrides.NetSdk.Shim.targetsvsintegration/shims/Microsoft.FSharp.Shim.targetsvsintegration/shims/Microsoft.Portable.FSharp.Shim.targetsvsintegration/src/Directory.Build.propsvsintegration/tests/Directory.Build.propsvsintegration/tests/Directory.Build.targetsvsintegration/tests/MockTypeProviders/Directory.Build.targetsReview Rules Reference
This review checks against MSBuild canonical patterns for:
Generated by MSBuild Quality Review