[msbuild-quality] MSBuild File Quality Report — 2026-10-15: missing FileWrites in CopyMSTestV2Resources targets
Los mantenedores suelen responder en 1 día
@YuliiaKovalova ya está trabajando en esto.
Desde el 16/10/2026.
- #11980 de @copilot-swe-agent — abierto
Evaluación
Este issue todavía no se ha evaluado.
Descripción
🔧 MSBuild File Quality Report — 2026-10-15
Files reviewed: 133 (.props/.targets across NuGet build/buildTransitive/buildMultiTargeting extensions, src/Package/MSTest.Sdk/Sdk/**, and repo infrastructure Directory.Build.*, Directory.Packages.props, eng/*.props|targets, samples/public/**)
Findings: 🔴 0 errors · 🟡 2 warnings · 🔵 0 suggestions
This is a mature, carefully authored MSBuild codebase. Conditions are
consistently quoted, overridable properties use the
Condition="'$(Prop)' == ''" guard, semicolon-delimited properties
(DefineConstants, NoWarn) are always appended rather than overwritten, no
hardcoded absolute paths were found, and *DependsOn chaining / CustomBefore*
/ CustomAfter* properties are handled correctly everywhere reviewed. No 🔴
Error-level violations were found.
🟡 Warnings
src/Adapter/MSTest.TestAdapter/buildTransitive/common/MSTest.TestAdapter.targets
- Rule A-4 — Missing
FileWritesregistration- Lines: 121-136
- Current:
<!-- Copy resources over to $(TargetDir) if this is a localized build. --> <Target Name="CopyMSTestV2Resources" BeforeTargets="PrepareForBuild" Condition=" '$(EnableMSTestV2CopyResources)' == 'true' " DependsOnTargets="GetMSTestV2CultureHierarchy" Inputs="@(MSTestV2Files)" Outputs="@(MSTestV2Files->'$(TargetDir)%(UICulture)%(FileName)%(Extension)')"> <ItemGroup> <!-- Add the localization file as content so it gets copied from nuget to bin folder. --> <Content Include="@(MSTestV2Files->'%(FullPath)')"> <Link>%(MSTestV2Files.UICulture)%(FileName).dll</Link> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <BaseAssemblyFullPath>%(FullPath)</BaseAssemblyFullPath> <Visible>False</Visible> </Content> </ItemGroup> </Target> - Finding:
CopyMSTestV2Resourcescorrectly declaresInputs/Outputsfor
incremental build (Rule A-3 is satisfied), but it adds the copied
localization DLLs asContentwithCopyToOutputDirectoryand never
registers the resulting output-directory files in@(FileWrites). Other
file-generating targets in this repo (e.g.GenerateVersionSourceFileand
_CopyAffectedTestsRuntimeAssetsin the rootDirectory.Build.targets)
consistently registerFileWritespaired with a
BeforeTargets="_CleanGetCurrentAndPriorFileWrites"cleanup target, but
this target does not, sodotnet cleanwill not remove the copied
localized satellite assemblies from the consumer's output directory. - Suggested:
<ItemGroup> <FileWrites Include="@(MSTestV2Files->'$(TargetDir)%(UICulture)%(FileName)%(Extension)')" /> </ItemGroup> </Target>
src/Adapter/MSTest.TestAdapter/buildTransitive/uwp/MSTest.TestAdapter.targets
- Rule A-4 — Missing
FileWritesregistration- Lines: 116-131
- Current:
<!-- Copy resources over to $(TargetDir) if this is a localized build. --> <Target Name="CopyMSTestV2Resources" BeforeTargets="PrepareForBuild" Condition=" '$(EnableMSTestV2CopyResources)' == 'true' AND '$(EnableMSTestRunner)' != 'true' " DependsOnTargets="GetMSTestV2CultureHierarchy" Inputs="@(MSTestV2Files)" Outputs="@(MSTestV2Files->'$(TargetDir)%(UICulture)\%(FileName)%(Extension)')"> <ItemGroup> <!-- Add the localization file as content so it gets copied from nuget to bin folder. --> <Content Include="@(MSTestV2Files->'%(FullPath)')"> <Link>%(MSTestV2Files.UICulture)\%(FileName).dll</Link> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <BaseAssemblyFullPath>%(FullPath)</BaseAssemblyFullPath> <Visible>False</Visible> </Content> </ItemGroup> </Target> - Finding: Same issue as the
commonvariant above — the UWP-specific
CopyMSTestV2Resourcestarget copies localized satellite assemblies to
$(TargetDir)viaContent/CopyToOutputDirectorybut never adds the
resulting files to@(FileWrites), sodotnet cleanleaves them behind. - Suggested:
<ItemGroup> <FileWrites Include="@(MSTestV2Files->'$(TargetDir)%(UICulture)\%(FileName)%(Extension)')" /> </ItemGroup> </Target>
🔵 Suggestions
None.
Files reviewed without findings (131)
NuGet build/buildTransitive/buildMultiTargeting extensions:
- src/Adapter/MSTest.Extensions.Hosting/build/MSTest.Extensions.Hosting.props
- src/Adapter/MSTest.Extensions.Hosting/build/MSTest.Extensions.Hosting.targets
- src/Adapter/MSTest.Extensions.Hosting/buildMultiTargeting/MSTest.Extensions.Hosting.props
- src/Adapter/MSTest.Extensions.Hosting/buildMultiTargeting/MSTest.Extensions.Hosting.targets
- src/Adapter/MSTest.Extensions.Hosting/buildTransitive/MSTest.Extensions.Hosting.props
- src/Adapter/MSTest.Extensions.Hosting/buildTransitive/MSTest.Extensions.Hosting.targets
- src/Adapter/MSTest.TestAdapter/build/net462/MSTest.TestAdapter.props
- src/Adapter/MSTest.TestAdapter/build/net462/MSTest.TestAdapter.targets
- src/Adapter/MSTest.TestAdapter/build/net8.0/MSTest.TestAdapter.props
- src/Adapter/MSTest.TestAdapter/build/net8.0/MSTest.TestAdapter.targets
- src/Adapter/MSTest.TestAdapter/build/net9.0/MSTest.TestAdapter.props
- src/Adapter/MSTest.TestAdapter/build/net9.0/MSTest.TestAdapter.targets
- src/Adapter/MSTest.TestAdapter/build/uap10.0/MSTest.TestAdapter.props
- src/Adapter/MSTest.TestAdapter/build/uap10.0/MSTest.TestAdapter.targets
- src/Adapter/MSTest.TestAdapter/buildTransitive/Parallelize.targets
- src/Adapter/MSTest.TestAdapter/buildTransitive/common/MSTest.TestAdapter.props
- src/Adapter/MSTest.TestAdapter/buildTransitive/uwp/MSTest.TestAdapter.props
- src/Analyzers/MSTest.Analyzers.Package/buildTransitive/MSTest.Analyzers.props
- src/Analyzers/MSTest.Analyzers.Package/buildTransitive/MSTest.Analyzers.targets
- src/TestFramework/TestFramework.Extensions/build/net462/MSTest.TestFramework.targets
- src/TestFramework/TestFramework.Extensions/build/net8.0/MSTest.TestFramework.targets
- src/TestFramework/TestFramework.Extensions/build/net9.0/MSTest.TestFramework.targets
- src/TestFramework/TestFramework.Extensions/build/netstandard2.0/MSTest.TestFramework.targets
- src/TestFramework/TestFramework.Extensions/build/uap10.0/MSTest.TestFramework.targets
- src/TestFramework/TestFramework.Extensions/buildTransitive/net8.0AndLater/MSTest.TestFramework.targets
- src/TestFramework/TestFramework.Extensions/buildTransitive/others/MSTest.TestFramework.targets
- src/Platform/Microsoft.Testing.Extensions.AzureDevOpsReport/build/Microsoft.Testing.Extensions.AzureDevOpsReport.props
- src/Platform/Microsoft.Testing.Extensions.AzureDevOpsReport/buildMultiTargeting/Microsoft.Testing.Extensions.AzureDevOpsReport.props
- src/Platform/Microsoft.Testing.Extensions.AzureDevOpsReport/buildTransitive/Microsoft.Testing.Extensions.AzureDevOpsReport.props
- src/Platform/Microsoft.Testing.Extensions.AzureFoundry/build/Microsoft.Testing.Extensions.AzureFoundry.props
- src/Platform/Microsoft.Testing.Extensions.AzureFoundry/buildMultiTargeting/Microsoft.Testing.Extensions.AzureFoundry.props
- src/Platform/Microsoft.Testing.Extensions.AzureFoundry/buildTransitive/Microsoft.Testing.Extensions.AzureFoundry.props
- src/Platform/Microsoft.Testing.Extensions.CrashDump/build/Microsoft.Testing.Extensions.CrashDump.props
- src/Platform/Microsoft.Testing.Extensions.CrashDump/buildMultiTargeting/Microsoft.Testing.Extensions.CrashDump.props
- src/Platform/Microsoft.Testing.Extensions.CrashDump/buildTransitive/Microsoft.Testing.Extensions.CrashDump.props
- src/Platform/Microsoft.Testing.Extensions.CtrfReport/build/Microsoft.Testing.Extensions.CtrfReport.props
- src/Platform/Microsoft.Testing.Extensions.CtrfReport/buildMultiTargeting/Microsoft.Testing.Extensions.CtrfReport.props
- src/Platform/Microsoft.Testing.Extensions.CtrfReport/buildTransitive/Microsoft.Testing.Extensions.CtrfReport.props
- src/Platform/Microsoft.Testing.Extensions.GitHubActionsReport/build/Microsoft.Testing.Extensions.GitHubActionsReport.props
- src/Platform/Microsoft.Testing.Extensions.GitHubActionsReport/buildMultiTargeting/Microsoft.Testing.Extensions.GitHubActionsReport.props
- src/Platform/Microsoft.Testing.Extensions.GitHubActionsReport/buildTransitive/Microsoft.Testing.Extensions.GitHubActionsReport.props
- src/Platform/Microsoft.Testing.Extensions.HangDump/build/Microsoft.Testing.Extensions.HangDump.props
- src/Platform/Microsoft.Testing.Extensions.HangDump/buildMultiTargeting/Microsoft.Testing.Extensions.HangDump.props
- src/Platform/Microsoft.Testing.Extensions.HangDump/buildTransitive/Microsoft.Testing.Extensions.HangDump.props
- src/Platform/Microsoft.Testing.Extensions.Hosting/build/Microsoft.Testing.Extensions.Hosting.props
- src/Platform/Microsoft.Testing.Extensions.Hosting/build/Microsoft.Testing.Extensions.Hosting.targets
- src/Platform/Microsoft.Testing.Extensions.Hosting/buildMultiTargeting/Microsoft.Testing.Extensions.Hosting.props
- src/Platform/Microsoft.Testing.Extensions.Hosting/buildMultiTargeting/Microsoft.Testing.Extensions.Hosting.targets
- src/Platform/Microsoft.Testing.Extensions.Hosting/buildTransitive/Microsoft.Testing.Extensions.Hosting.props
- src/Platform/Microsoft.Testing.Extensions.Hosting/buildTransitive/Microsoft.Testing.Extensions.Hosting.targets
- src/Platform/Microsoft.Testing.Extensions.HotReload/build/Microsoft.Testing.Extensions.HotReload.props
- src/Platform/Microsoft.Testing.Extensions.HotReload/buildMultiTargeting/Microsoft.Testing.Extensions.HotReload.props
- src/Platform/Microsoft.Testing.Extensions.HotReload/buildTransitive/Microsoft.Testing.Extensions.HotReload.props
- src/Platform/Microsoft.Testing.Extensions.HtmlReport/build/Microsoft.Testing.Extensions.HtmlReport.props
- src/Platform/Microsoft.Testing.Extensions.HtmlReport/buildMultiTargeting/Microsoft.Testing.Extensions.HtmlReport.props
- src/Platform/Microsoft.Testing.Extensions.HtmlReport/buildTransitive/Microsoft.Testing.Extensions.HtmlReport.props
- src/Platform/Microsoft.Testing.Extensions.JUnitReport/build/Microsoft.Testing.Extensions.JUnitReport.props
- src/Platform/Microsoft.Testing.Extensions.JUnitReport/buildMultiTargeting/Microsoft.Testing.Extensions.JUnitReport.props
- src/Platform/Microsoft.Testing.Extensions.JUnitReport/buildTransitive/Microsoft.Testing.Extensions.JUnitReport.props
- src/Platform/Microsoft.Testing.Extensions.OpenTelemetry/build/Microsoft.Testing.Extensions.OpenTelemetry.props
- src/Platform/Microsoft.Testing.Extensions.OpenTelemetry/build/Microsoft.Testing.Extensions.OpenTelemetry.targets
- src/Platform/Microsoft.Testing.Extensions.OpenTelemetry/buildMultiTargeting/Microsoft.Testing.Extensions.OpenTelemetry.props
- src/Platform/Microsoft.Testing.Extensions.OpenTelemetry/buildMultiTargeting/Microsoft.Testing.Extensions.OpenTelemetry.targets
- src/Platform/Microsoft.Testing.Extensions.OpenTelemetry/buildTransitive/Microsoft.Testing.Extensions.OpenTelemetry.props
- src/Platform/Microsoft.Testing.Extensions.OpenTelemetry/buildTransitive/Microsoft.Testing.Extensions.OpenTelemetry.targets
- src/Platform/Microsoft.Testing.Extensions.PackagedApp.MSBuild/build/Microsoft.Testing.Extensions.PackagedApp.MSBuild.targets
- src/Platform/Microsoft.Testing.Extensions.PackagedApp.MSBuild/buildMultiTargeting/Microsoft.Testing.Extensions.PackagedApp.MSBuild.targets
- src/Platform/Microsoft.Testing.Extensions.PackagedApp.MSBuild/buildTransitive/Microsoft.Testing.Extensions.PackagedApp.MSBuild.targets
- src/Platform/Microsoft.Testing.Extensions.PackagedApp/build/Microsoft.Testing.Extensions.PackagedApp.props
- src/Platform/Microsoft.Testing.Extensions.PackagedApp/buildMultiTargeting/Microsoft.Testing.Extensions.PackagedApp.props
- src/Platform/Microsoft.Testing.Extensions.PackagedApp/buildTransitive/Microsoft.Testing.Extensions.PackagedApp.props
- src/Platform/Microsoft.Testing.Extensions.Retry/build/Microsoft.Testing.Extensions.Retry.props
- src/Platform/Microsoft.Testing.Extensions.Retry/buildMultiTargeting/Microsoft.Testing.Extensions.Retry.props
- src/Platform/Microsoft.Testing.Extensions.Retry/buildTransitive/Microsoft.Testing.Extensions.Retry.props
- src/Platform/Microsoft.Testing.Extensions.Telemetry/build/Microsoft.Testing.Extensions.Telemetry.props
- src/Platform/Microsoft.Testing.Extensions.Telemetry/buildMultiTargeting/Microsoft.Testing.Extensions.Telemetry.props
- src/Platform/Microsoft.Testing.Extensions.Telemetry/buildTransitive/Microsoft.Testing.Extensions.Telemetry.props
- src/Platform/Microsoft.Testing.Extensions.TrxReport/build/Microsoft.Testing.Extensions.TrxReport.props
- src/Platform/Microsoft.Testing.Extensions.TrxReport/buildMultiTargeting/Microsoft.Testing.Extensions.TrxReport.props
- src/Platform/Microsoft.Testing.Extensions.TrxReport/buildTransitive/Microsoft.Testing.Extensions.TrxReport.props
- src/Platform/Microsoft.Testing.Extensions.VideoRecorder/build/Microsoft.Testing.Extensions.VideoRecorder.props
- src/Platform/Microsoft.Testing.Extensions.VideoRecorder/buildMultiTargeting/Microsoft.Testing.Extensions.VideoRecorder.props
- src/Platform/Microsoft.Testing.Extensions.VideoRecorder/buildTransitive/Microsoft.Testing.Extensions.VideoRecorder.props
- src/Platform/Microsoft.Testing.Platform.MSBuild/build/Microsoft.Testing.Platform.MSBuild.props
- src/Platform/Microsoft.Testing.Platform.MSBuild/build/Microsoft.Testing.Platform.MSBuild.targets
- src/Platform/Microsoft.Testing.Platform.MSBuild/buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.CustomTestTarget.targets
- src/Platform/Microsoft.Testing.Platform.MSBuild/buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.VSTest.targets
- src/Platform/Microsoft.Testing.Platform.MSBuild/buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.props
- src/Platform/Microsoft.Testing.Platform.MSBuild/buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.targets
- src/Platform/Microsoft.Testing.Platform.MSBuild/buildTransitive/Microsoft.Testing.Platform.MSBuild.props
- src/Platform/Microsoft.Testing.Platform.MSBuild/buildTransitive/Microsoft.Testing.Platform.MSBuild.targets
- src/Platform/Microsoft.Testing.Platform.ServerMode.Client.Sources/build/Microsoft.Testing.Platform.ServerMode.Client.Sources.targets
- src/Platform/Microsoft.Testing.Platform/build/Microsoft.Testing.Platform.props
- src/Platform/Microsoft.Testing.Platform/build/Microsoft.Testing.Platform.targets
- src/Platform/Microsoft.Testing.Platform/buildMultiTargeting/Microsoft.Testing.Platform.props
- src/Platform/Microsoft.Testing.Platform/buildMultiTargeting/Microsoft.Testing.Platform.targets
- src/Platform/Microsoft.Testing.Platform/buildTransitive/Microsoft.Testing.Platform.props
- src/Platform/Microsoft.Testing.Platform/buildTransitive/Microsoft.Testing.Platform.targets
SDK files:
- src/Package/MSTest.Sdk/Sdk/Features/Aspire.targets
- src/Package/MSTest.Sdk/Sdk/Features/Playwright.targets
- src/Package/MSTest.Sdk/Sdk/Features/WindowsUIAutomation.targets
- src/Package/MSTest.Sdk/Sdk/Runner/ClassicEngine.targets
- src/Package/MSTest.Sdk/Sdk/Runner/Common.targets
- src/Package/MSTest.Sdk/Sdk/Runner/NativeAOT.targets
- src/Package/MSTest.Sdk/Sdk/Sdk.targets
- src/Package/MSTest.Sdk/Sdk/VSTest/VSTest.targets
Repository infrastructure:
- Directory.Build.props
- Directory.Build.targets
- Directory.Packages.props
- eng/AfterSolutionBuild.targets
- eng/Analyzers.props
- eng/Build.props
- eng/Publishing.props
- eng/Signing.props
- eng/Tools.props
- eng/Versions.props
- src/Directory.Build.props
- src/Platform/Directory.Build.props
- src/Platform/Directory.Build.targets
- test/Directory.Build.props
- test/Directory.Build.targets
- test/IntegrationTests/TestAssets/Directory.Build.targets
- samples/public/Directory.Build.props
- samples/public/Directory.Build.targets
- samples/public/Directory.Packages.props
- samples/public/MTPHostIntegration/Directory.Build.props
Reference
This review applies the rule catalog defined in
.github/agents/msbuild-reviewer.agent.md.
Generated by MSBuild Quality Review (scheduled scan, 2026-10-15).
🤖 Automated content by GitHub Copilot. Generated by the MSBuild Quality Review workflow. · copilot · auto · 359.1 AIC · ⌖ 5.65 AIC · ⊞ 9.3K · [◷]( · ◷)
- expires on Oct 22, 2026, 3:07 AM UTC
- Lenguaje dominante
- C#
- Estrellas
- 1k
- Forks
- 314
- Merge medio
- 9 h 33 min
- PR fusionados (30 d)
- 427
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de microsoft/testfx
-
Allow a trailing CancellationToken parameter on MSTest test methodsPosiblemente ocupada @Evangelink la tomó hoy. Abiertoarea/mstest area/parameterized-tests needs/triage
Dificultad 4/5 3-5 días Aptitud para principiantes 22/100
Los mantenedores suelen responder en 1 día
-
[file-diet] Refactor AzureDevOpsSummaryReporter.Markdown.cs (552 lines) into focused partialsAbiertotype/automation type/tech-debt
Dificultad 4/5 3-5 días Aptitud para principiantes 42/100
Los mantenedores suelen responder en 1 día
-
area/dump needs/triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 45/100
microsoft/testfx#11981 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
[code-simplifier] Deduplicate exit-code explanation formatting in AzureDevOpsSummaryReporterAbiertoagentic-workflows type/automation type/tech-debt
Dificultad 2/5 1-3 horas Aptitud para principiantes 25/100
Los mantenedores suelen responder en 1 día
-
type/automation type/tech-debt
Dificultad 5/5 Más de una semana Aptitud para principiantes 5/100
Los mantenedores suelen responder en 1 día
Todos los issues de microsoft/testfx
Issues similares
-
area: design documentation
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
eyalgolan/statecraft-israel#883 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
Los mantenedores suelen responder en 3 días
-
area/indexing bug package/core triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
Los mantenedores suelen responder en 1 día
-
enhancement needs triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
elastic/docs-builder#4495 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
Los mantenedores suelen responder en 1 día