Skip to content

Overeager check for RuntimeIdentifier when PublishAot=true #33414

Closed

Description

There's a check to verify that RuntimeIdentifier is set when PublishAot=true:

<NETSdkError Condition="'$(PublishAot)' == 'true' and '$(RuntimeIdentifier)' == '' and '$(_IsPublishing)' == 'true'"
ResourceName="ImplicitRuntimeIdentifierResolutionForPublishPropertyFailed"
FormatArguments="PublishAot"/>

Unfortunately this check is not valid when building universal apps for macOS and Mac Catalyst (the netX-macos and netX-maccatalyst target frameworks).

When building a universal app, the project file will set RuntimeIdentifiers (plural):

<TargetFramework>net8.0-macos</TargetFramework>
<RuntimeIdentifiers>osx-x64;osx-arm</RuntimeIdentifiers>

and then during the build, the macOS SDK will run two inner builds, with RuntimeIdentifiers unset, and RuntimeIdentifier set to each of the rids.

The problem is that the outer build, where RuntimeIdentifiers is set, but RuntimeIdentifier isn't, triggers the above-mentioned verification, and that fails the build.

I attempted to unset PublishAot for the outer build, but that doesn't work for two reasons:

  1. It can't be unset if customers pass /p:PublishAot=true on the command line.
  2. The package restore won't restore the NativeAOT packages nor include them in the build, and thus effectively NativeAOT is turned off for the inner builds as well, even if we set PublishAot=true for them.

This workaround worked around the second point:

<Target Name="EnablePublishAot" BeforeTargets="ProcessFrameworkReferences">
    <PropertyGroup>
        <_OriginalPublishAot>$(PublishAot)</_OriginalPublishAot>
        <PublishAot>true</PublishAot>
    </PropertyGroup>
</Target>

<Target Name="RestorePublishAot" AfterTargets="ProcessFrameworkReferences">
    <PropertyGroup>
        <PublishAot>$(_OriginalPublishAot)</PublishAot>
    </PropertyGroup>
</Target>

but it's on the uglier side of ugly, and not a complete solution anyways (point 1 is still a problem).

I see two potential fixes:

a. Add a property to skip this check, and set this property in the macOS SDK:

    <NETSdkError Condition="'$(PublishAot)' == 'true' and '$(RuntimeIdentifier)' == '' and '$(_IsPublishing)' == 'true' and '$(AllowPublishAotWithoutRuntimeIdentifier)' != 'true'"
                ResourceName="ImplicitRuntimeIdentifierResolutionForPublishPropertyFailed"
                FormatArguments="PublishAot"/>

b. Check for RuntimeIdentifiers (plural) as well:

    <NETSdkError Condition="'$(PublishAot)' == 'true' and '$(RuntimeIdentifier)' == '' and '$(RuntimeIdentifiers)' != 'true' and '$(_IsPublishing)' == 'true'"
                ResourceName="ImplicitRuntimeIdentifierResolutionForPublishPropertyFailed"
                FormatArguments="PublishAot"/>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions