Skip to content

Refresh copy marker when implementation output changes - #14231

Merged
AlesProkop merged 5 commits into
dotnet:mainfrom
AlesProkop:alesprokop/copy-marker-main-output
Jul 7, 2026
Merged

AlesProkop merged 5 commits into
dotnet:mainfrom
AlesProkop:alesprokop/copy-marker-main-output

Conversation

@AlesProkop

@AlesProkop AlesProkop commented Jul 1, 2026

Copy link
Copy Markdown
Member

Fixes #13478.

Context

CopyUpToDateMarker is used by Visual Studio's fast up-to-date check to decide whether referencing projects may need to observe updated implementation outputs when reference assemblies are unchanged.

Today the marker only advances from _CopyFilesMarkedCopyLocal when a copy-local reference is actually written. That preserves no-op incremental builds, but misses implementation-only changes where the project's main assembly is updated and no copy-local references were copied.

Changes

  • Capture WroteAtLeastOneFile from the main assembly copy in CopyFilesToOutputDirectory.
  • Touch @(CopyUpToDateMarker) when ProduceReferenceAssembly=true and the main implementation assembly was actually copied to OutDir.
  • Keep no-op builds from advancing the marker.
  • Add regression coverage for marker advancement, no-op behavior, and ProduceReferenceAssembly=false.

Validation

  • dotnet test D:\msbuild\src\Tasks.UnitTests\Microsoft.Build.Tasks.UnitTests.csproj --framework net472 --filter "FullyQualifiedName~Microsoft.Build.Tasks.UnitTests.RegressionTests.CopyUpToDateMarker"
  • D:\msbuild\build.cmd -v quiet
  • Manual end-to-end MSBuild check with the built artifacts\bin\MSBuild\Debug\net472\MSBuild.exe: marker unchanged on no-op build and advanced after implementation-output change.

Touch CopyUpToDateMarker when the main implementation assembly is actually copied to the output directory. This lets implementation-only changes advance the marker even when no copy-local references were copied, without reintroducing no-op marker updates.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@AlesProkop
AlesProkop marked this pull request as ready for review July 2, 2026 10:56
Copilot AI review requested due to automatic review settings July 2, 2026 10:56

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates MSBuild’s up-to-date marker behavior to better support Visual Studio’s fast up-to-date check when reference assemblies are produced, ensuring the marker advances when the implementation output is actually copied to OutDir (even if no copy-local references changed).

Changes:

  • Capture whether the main assembly copy in CopyFilesToOutputDirectory wrote at least one file, and use that to decide when to touch @(CopyUpToDateMarker).
  • Touch @(CopyUpToDateMarker) on implementation assembly writes when $(ProduceReferenceAssembly) is true, covering implementation-only changes.
  • Add regression tests validating marker advancement, no-op behavior, and the ProduceReferenceAssembly=false case.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 8 comments.

File Description
src/Tasks/Microsoft.Common.CurrentVersion.targets Tracks main assembly copy writes and touches CopyUpToDateMarker when reference assemblies are produced and implementation output changes.
src/Tasks.UnitTests/RegressionTests.cs Adds regression tests for marker advancement/no-op behavior and for ProduceReferenceAssembly=false.
Comments suppressed due to low confidence (1)

src/Tasks.UnitTests/RegressionTests.cs:10

  • This file adds new test assertions, but the repo’s testing guidance prefers Shouldly assertions in modified test code. Add the Shouldly using so the new assertions can be expressed with ShouldBe* helpers (and update the asserts below accordingly).
using System;
using System.IO;
using System.Threading;
using Microsoft.Build.Evaluation;
using Microsoft.Build.Shared;
using Microsoft.Build.UnitTests;
using Xunit;

Comment thread src/Tasks.UnitTests/RegressionTests.cs Outdated
Comment thread src/Tasks.UnitTests/RegressionTests.cs Outdated
Comment thread src/Tasks.UnitTests/RegressionTests.cs Outdated
Comment thread src/Tasks.UnitTests/RegressionTests.cs Outdated
Comment thread src/Tasks.UnitTests/RegressionTests.cs Outdated
Comment thread src/Tasks.UnitTests/RegressionTests.cs
Comment thread src/Tasks.UnitTests/RegressionTests.cs
Comment thread src/Tasks.UnitTests/RegressionTests.cs
Comment thread src/Tasks/Microsoft.Common.CurrentVersion.targets Outdated
Comment thread src/Tasks/Microsoft.Common.CurrentVersion.targets Outdated
@AlesProkop
AlesProkop requested a review from JanProvaznik July 7, 2026 07:15
Avoid full-framework reference assembly lookup in the synthetic marker test project so the tests can run on agents without .NET Framework reference assemblies.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@AlesProkop
AlesProkop enabled auto-merge (squash) July 7, 2026 13:47
WarperSan pushed a commit to WarperSan/ThunderPipe that referenced this pull request Sep 17, 2026
Updated
[Microsoft.Build.Utilities.Core](https://github.com/dotnet/msbuild) from
18.9.6 to 18.10.1.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.Build.Utilities.Core's
releases](https://github.com/dotnet/msbuild/releases)._

## 18.10.1

## What's Changed
* [vs16.11] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/msbuild#13103
* [vs17.12] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/msbuild#13796
* [vs17.8] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/msbuild#13902
* [vs17.11] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/msbuild#13903
* [vs17.12] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/msbuild#13909
* [vs17.12] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/msbuild#13986
* Add vs18.9 to merge-flow config; retire vs18.3 by @​JanProvaznik in
dotnet/msbuild#14214
* Bump labeler-cache-retention to use issue-labeler v2.1.0 by
@​jeffhandley in dotnet/msbuild#14171
* Bump main to 18.10.0 after vs18.9 snap by @​JanProvaznik in
dotnet/msbuild#14216
* Improve release skill: Phase 2 DARC rules, VMR backflow, deterministic
baseline by @​JanProvaznik in
dotnet/msbuild#14220
* Determinize release: hardcode OptProf baseline + Phase 3.2 baseline
resolver by @​JanProvaznik in
dotnet/msbuild#14222
* Serialize BuildRequestConfiguration.RequestedTargets to fix solution
metaproject MSB4057 in parallel builds by @​ViktorHofer in
dotnet/msbuild#14223
* [main] Update dependencies from nuget/nuget.client by
@​dotnet-maestro[bot] in dotnet/msbuild#14203
* Core support for AbsolutePath/FileInfo/DirectoryInfo and ITaskItem<T>
as task parameters by @​baronfel in
dotnet/msbuild#13971
* [main] Update dependencies from dotnet/roslyn by @​dotnet-maestro[bot]
in dotnet/msbuild#14206
* Fix existence cache kind poisoning by @​AlesProkop in
dotnet/msbuild#14249
* [main] Source code updates from dotnet/dotnet by @​dotnet-maestro[bot]
in dotnet/msbuild#14226
* Don't disable the MSBuild server for /mt builds when node reuse is off
by @​AR-May in dotnet/msbuild#14248
* Enhance expert reviewer guidelines with additional checks. by @​AR-May
in dotnet/msbuild#14255
* [main] Source code updates from dotnet/dotnet by @​dotnet-maestro[bot]
in dotnet/msbuild#14253
* [main] Update dependencies from dotnet/roslyn by @​dotnet-maestro[bot]
in dotnet/msbuild#14268
* [main] Update dependencies from nuget/nuget.client by
@​dotnet-maestro[bot] in dotnet/msbuild#14267
* Bump github/gh-aw-actions/setup from 0.81.6 to 0.82.2 by
@​dependabot[bot] in dotnet/msbuild#14266
* Avoid boxing the struct enumerator in
PropertyDictionary<T>.GetEnumerator() by @​nareshjo in
dotnet/msbuild#14272
* Refresh copy marker when implementation output changes by @​AlesProkop
in dotnet/msbuild#14231
* Send task-host build process environment as delta by @​OvesN in
dotnet/msbuild#14126
* Add regression coverage for metadata newline preservation by
@​VolPlita in dotnet/msbuild#14261
* Fix EmbedInBinlog items with relative paths from child projects by
@​huulinhnguyen-dev in dotnet/msbuild#13990
* Stop requiring VersionPrefix updates in servicing - insert prerelease
versions to VS by @​ViktorHofer in
dotnet/msbuild#14277
* Fix WriteLinesToFile rewriting unchanged file when custom encoding is
used by @​huulinhnguyen-dev in
dotnet/msbuild#14146
* Enable trim/AOT analyzers for Microsoft.Build and clean up annotations
by @​JeremyKuhne in dotnet/msbuild#14064
* [automated] Merge branch 'vs18.9' => 'main' by @​github-actions[bot]
in dotnet/msbuild#14291
* Fix MicroBuild plugin feed URL to use allowed pkgs.dev.azure.com
format by @​AlesProkop in dotnet/msbuild#14295
* Pass ExcludeRestorePackageImports during restore to avoid redundant
evaluations by @​ViktorHofer with @​Copilot in
dotnet/msbuild#14274
* [vs18.7] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/msbuild#13988
* Adopt Clever Test Selection (CTS) as parallel, non-blocking PR
pipeline by @​jankratochvilcz in
dotnet/msbuild#14212
* Harden exceptions when connecting to server by @​JanProvaznik in
dotnet/msbuild#14292
* Update MicrosoftBuildVersion in analyzer template by
@​github-actions[bot] in dotnet/msbuild#13886
* Fix MSBuild Server client dropping build result under WaitAny race
(#​14172) by @​JanProvaznik in
dotnet/msbuild#14251
* Partially revert #​13660: remove NuGet RestoreTask transient TaskHost
workaround by @​JanProvaznik in
dotnet/msbuild#14297
* Disable daily AI credits guardrail for Expert Code Review workflow by
@​JanProvaznik with @​Copilot in
dotnet/msbuild#14314
* Localized file check-in by OneLocBuild Task: Build definition ID 9434:
Build ID 14614733 by @​dotnet-bot in
dotnet/msbuild#14246
* Add opt-in partial (stop-after-pass) project evaluation by
@​ViktorHofer in dotnet/msbuild#14290
* Use partial evaluation for -getProperty/-getItem without a target by
@​ViktorHofer in dotnet/msbuild#14296
* [main] Source code updates from dotnet/dotnet by @​dotnet-maestro[bot]
in dotnet/msbuild#14324
* [main] Update dependencies from dotnet/roslyn by @​dotnet-maestro[bot]
in dotnet/msbuild#14333
* [main] Update dependencies from nuget/nuget.client by
@​dotnet-maestro[bot] in dotnet/msbuild#14330
* Bump github/gh-aw-actions/setup from 0.82.2 to 0.82.8 by
@​dependabot[bot] in dotnet/msbuild#14328
* Restrict partial evaluation to ProjectInstance by @​ViktorHofer in
dotnet/msbuild#14340
 ... (truncated)

Commits viewable in [compare
view](dotnet/msbuild@v18.9.6...v18.10.1).
</details>

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=Microsoft.Build.Utilities.Core&package-manager=nuget&previous-version=18.9.6&new-version=18.10.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This was referenced Sep 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

MSBuild .up2date files can permanently hork U2D check in VS

4 participants