Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

[msbuild-quality] MSBuild File Quality Report — 2026-10-15: missing FileWrites in CopyMSTestV2Resources targets

Abierto
#11,937 1 comentario 1 reacción 2 asignados Ver en GitHub

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

area/mtp-msbuild type/automation type/tech-debt
🔧 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 FileWrites registration
    • 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: CopyMSTestV2Resources correctly declares Inputs/Outputs for
      incremental build (Rule A-3 is satisfied), but it adds the copied
      localization DLLs as Content with CopyToOutputDirectory and never
      registers the resulting output-directory files in @(FileWrites). Other
      file-generating targets in this repo (e.g. GenerateVersionSourceFile and
      _CopyAffectedTestsRuntimeAssets in the root Directory.Build.targets)
      consistently register FileWrites paired with a
      BeforeTargets="_CleanGetCurrentAndPriorFileWrites" cleanup target, but
      this target does not, so dotnet clean will 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 FileWrites registration
    • 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 common variant above — the UWP-specific
      CopyMSTestV2Resources target copies localized satellite assemblies to
      $(TargetDir) via Content/CopyToOutputDirectory but never adds the
      resulting files to @(FileWrites), so dotnet clean leaves 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

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de microsoft/testfx

Todos los issues de microsoft/testfx

Issues similares

Más issues de C#

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.