Skip to content

[release/11.0-rc1] Use stable net/netframework folders for the mono SDK tasks - #132414

Open
github-actions[bot] wants to merge 1 commit into
release/11.0-rc1from
backport/pr-132402-to-release/11.0-rc1
Open

[release/11.0-rc1] Use stable net/netframework folders for the mono SDK tasks#132414
github-actions[bot] wants to merge 1 commit into
release/11.0-rc1from
backport/pr-132402-to-release/11.0-rc1

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Backport of #132402 to release/11.0-rc1

/cc @akoeplinger

Customer Impact

  • Customer reported
  • Found internally

[Select one or both of the boxes. Describe how this issue impacts customers, citing the expected and actual behaviors and scope of the issue. If customer-reported, provide the issue number.]

Regression

  • Yes
  • No

[If yes, specify when the regression was introduced. Provide the PR or commit if known.]

Testing

[How was the fix verified? How was the issue missed previously? What tests were added?]

Risk

[High/Medium/Low. Justify the indication by mentioning how risks were measured and addressed.]

IMPORTANT: If this backport is for a servicing release, please verify that:

  • For .NET 8 and .NET 9: The PR target branch is release/X.0-staging, not release/X.0.
  • For .NET 10+: The PR target branch is release/X.0 (no -staging suffix).

Package authoring no longer needed in .NET 9

IMPORTANT: Starting with .NET 9, you no longer need to edit a NuGet package's csproj to enable building and bump the version.
Keep in mind that we still need package authoring in .NET 8 and older versions.

Follow-up to #130782, which did the same for
`Microsoft.NET.Sdk.WebAssembly.Pack.Tasks`.

The mono and WebAssembly SDK packages placed their task assemblies in
TFM-versioned subfolders (`tasks/net11.0`, `tasks/net472`,
`tools/net11.0`), and the `Sdk.props.in`/`Sdk.targets.in` templates
hardcoded those TFMs via template tokens. Every .NET Core TFM bump then
required coordinated updates across the layout producer and all of its
consumers.

This emits the task build output into stable, version-independent
folders (`net` for .NET Core, `netframework` for .NET Framework) by
overriding `OutputPath`/`IntermediateOutputPath`, mirroring
`ILLink.Tasks`. It covers `WasmAppBuilder`, `WasmBuildTasks`,
`MonoAOTCompiler`, `MonoTargetsTasks`, `LibraryBuilder`,
`MobileBuildTasks`, `AppleAppBuilder`, `AndroidAppBuilder`,
`HelixTestTasks` and `WorkloadBuildTasks`.

The package layouts and the in-tree consumers (`Directory.Build.props`,
`WasmApp.LocalBuild.props`, `AppleBuild.LocalBuild.props`) now use the
same names, which also lets the hardcoded `_NetCoreAppToolCurrent`
literals and the now-dead property forwarding in `tests.ioslike.targets`
go away.

With no TFM tokens left, the `.in` templates become fully static, so
they're renamed to their final names and the `GenerateFileFromTemplate`
steps are dropped from the pkgprojs.

`WorkloadBuildTasks` keeps a TFM-named folder for its pinned `net8.0`
build, since that one is selected by the consuming project's own TFM.
Its `Sdk.targets` now defaults to `tasks/net` rather than resolving
`tasks/$(TargetFramework)`, which silently produced a nonexistent path
for consumers on any other TFM.

### Latent issues fixed along the way

- The netframework `OutputPath` overrides are now guarded on
`NetFrameworkToolCurrent` being non-empty. In source-only builds it is
empty, so the bare `'$(TargetFramework)' ==
'$(NetFrameworkToolCurrent)'` comparison was *also* true in the outer
build of a multi-targeting project (where `TargetFramework` is likewise
empty), appending `netframework/` to the shared `OutputPath`. This
applies to `Microsoft.NET.Sdk.WebAssembly.Pack.Tasks` too, which grew
the same pattern in #130782.
- `WasmBuildTasks.dll` was packaged at `tasks/` while
`WasmBuildTasksAssemblyPath` pointed at `tasks/<TFM>/`. It now ships in
`tasks/net` where the property resolves.
- `src/tests/Common/Directory.Build.targets` re-derived the
`WasmAppBuilder` and `MonoTargetsTasks` output paths instead of using
the shared properties, so it had already drifted. It now uses them.
- `TestExclusionListTasks` was removed in #123909 but left behind a
stale project reference and two unused properties.
- The `MonoAOTCompiler.Task` readme pointed at
`tools/<target-framework>/` rather than the `tasks/` folder the package
actually ships.

### Validation

All 10 task projects build clean into `net` (+ `netframework` where
multi-targeted), in both normal and source-only mode. All affected
packages were packed and unzipped: they contain `tasks/net`,
`tasks/netframework`, `tools/net` and `tasks/net8.0` as intended, with
no TFM version strings in any package path. Every `*TasksAssemblyPath`
property was evaluated and confirmed to resolve to a file that exists on
disk.

Fixes #123155

> [!NOTE]
> This pull request was authored with the assistance of GitHub Copilot.

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 50cbbd7b-5246-4157-959c-0f92990d8f73
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 4 pipeline(s).
12 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-Build-mono Servicing-approved Approved for servicing release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants