[msbuild-quality] MSBuild defaults and incremental resource tracking regressions
维护者通常 2 天内回复
还没有人认领这个 Issue。
评估
- 难度
- 3/5
- 预计耗时
- 1-2 天
- 新手友好度
- 68/100
- Issue 类型
- 缺陷
- 描述清晰度
- 基本清楚
- 活跃度
- 活跃
- 技术栈
- fsharp
- 领域
- build-system
调研方向
Start with the four named files: src/FSharp.Build/Microsoft.FSharp.NetSdk.props, eng/Packages.props, FSharpBuild.Directory.Build.targets, and vsintegration/tests/MockTypeProviders/Directory.Build.props. Review the reported lines and surrounding MSBuild evaluation order, item names, and property composition. Done means the four reported regressions are corrected without overwriting consumer settings or inherited suppressions, and the computed versions and resource files are actually consumed.
由索引模型根据 Issue 内容生成。
描述
🔧 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:
ValueTupleImplicitPackageVersionis 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.9floor 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, soIntermediateResourceFilesHashis 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
NoWarnassignment 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
CreateManifestResourceNamesDependsOnoverwrite, missingFileWritesregistration 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.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.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 · ◷
- 主要语言
- F#
- 星标
- 4.3k
- 派生
- 884
- 平均合并
- 2 天 11 小时
- 30 天内合并 PR
- 73
环境准备
在浏览器里用你自己的 GitHub 账号启动这个项目的开发容器。
- 没有 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
dotnet/fsharp 的其他 Issue
-
Needs-Triage
难度 1/5 1 小时以内 新手友好度 95/100
维护者通常 2 天内回复
-
Semantic classification cache for opened documents is never populated (written to the unopened-documents cache)可能已有人在做 @xperiandri 于 69 天前认领。 未关闭Needs-Triage
难度 1/5 1 小时以内 新手友好度 90/100
维护者通常 2 天内回复
-
Needs-Triage
难度 2/5 1-3 小时 新手友好度 78/100
维护者通常 2 天内回复
-
Bug Needs-Triage
难度 2/5 1-3 小时 新手友好度 78/100
维护者通常 2 天内回复
-
Needs-Triage
难度 4/5 3-5 天 新手友好度 45/100
维护者通常 2 天内回复
相似的 Issue
-
dependencies good first issue severity: low
难度 2/5 1-3 小时 新手友好度 85/100
TMHSDigital/GH-Arcade#27 ·
-
documentation good first issue
难度 1/5 1 小时以内 新手友好度 82/100
SO4-Markets/so4-oracle#1438 ·
维护者通常 1 天内回复
-
tech debt
难度 2/5 1-3 小时 新手友好度 83/100
AbsaOSS/living-doc-toolkit#116 ·
维护者通常 1 天内回复
-
bug
难度 2/5 1-3 小时 新手友好度 82/100
维护者通常 3 天内回复
-
security
难度 1/5 1 小时以内 新手友好度 75/100
维护者通常 1 天内回复