[Xamarin.Android.Buid.Tasks] don't set $(PublishSelfContained) for .NET 9 (#8565)
Context:d21e6bf5c5
Context:8fa5d99341
Context:0cd963ac03
Context:95946d2e7f
Context:964746e83a
Building a `net8.0-android` project with a .NET 9 SDK will fail when providing an RID: > dotnet publish # works > dotnet publish -r android-arm64 MSBuild version 17.9.0-preview-23577-01+31108edc1 for .NET … bin\Debug\dotnet\sdk\9.0.100-alpha.1.23603.1\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.FrameworkReferenceResolution.targets(494,5): error NETSDK1112: The runtime pack for Microsoft.Android.Runtime.34.android-arm64 was not downloaded. Try running a NuGet restore with the RuntimeIdentifier 'android-arm64'. Our repo also sets `$(DisableTransitiveFrameworkReferenceDownloads)` within unit tests (95946d2e
), which causes a slightly different error message: error NETSDK1185: The Runtime Pack for FrameworkReference 'Microsoft.Android.Runtime.34.android-arm' was not available. This may be because DisableTransitiveFrameworkReferenceDownloads was set to true. which matches the TODO within 8fa5d993: > * A specific case of `dotnet publish -f net8.0-android -r android-arm` > is failing with: > > error NETSDK1185: The Runtime Pack for FrameworkReference 'Microsoft.Android.Runtime.34.android-arm' was not available. This may be because DisableTransitiveFrameworkReferenceDownloads was set to true. > > This is related to `$(AllowSelfContainedWithoutRuntimeIdentifier)`, > but I will address in a future PR. This will likely require .NET 8 > Android workload changes. In .NET 8,0cd963ac0
began setting `$(PublishSelfContained)`=false as a way to avoid the error: Microsoft.NET.RuntimeIdentifierInference.targets(212,5): error NETSDK1191: A runtime identifier for the property 'SelfContained' couldn't be inferred. Specify a rid explicitly. Because Android is always self-contained, we set `$(SelfContained)` through other means (964746e8; `$(SelfContained)` is set as part of the inner builds), and everything worked. In .NET 9, other changes were made such that this "workaround" no longer works. To fix this, @@rolfbjarne introduced dotnet/sdk@d21e6bf5 and `$(AllowSelfContainedWithoutRuntimeIdentifier)` as a way to fix the issue going forward in .NET 9. We are using the new property in .NET 9 since8fa5d993
. Unfortunately, this leaves one case that is still broken: 1. Create a new project with `$(TargetFramework)`=net8.0-android (i.e. a .NET 8 project) 2. Using the .NET 9 SDK 3. Building while specifying a RID, e.g. dotnet publish -r android-arm64 It seems like, for now, we can just condition our workaround for .NET 8 and below: <PublishSelfContained Condition=" '$(PublishSelfContained)' == '' and $([MSBuild]::VersionLessThan($(NETCoreSdkVersion), '9.0')) ">false</PublishSelfContained> Making this change locally, both cases work for me: * .NET 8 project, .NET 8 SDK: `dotnet publish -r android-arm64` * .NET 8 project, .NET 9 SDK: `dotnet publish -r android-arm64` The only other solution would be to create our own empty `_CheckForUnsupportedAppHostUsage` target to avoid errors, but that seems explicitly worse. We should also backport dotnet/sdk#d21e6bf5 to .NET 8 SDKs, but it will probably take a month for that to ship. After this is merged and we have a new, nightly .NET 8 build, we can restore the [`XASdkTests.DotNetPublish()` unit test][0] on main. [0]:40cc8eaf78/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs (L202-L205)
This commit is contained in:
Родитель
3333306b87
Коммит
73efcfcad0
|
@ -75,7 +75,7 @@
|
|||
This prevents an early error message during 'dotnet publish'.
|
||||
We handle $(SelfContained) in a custom way where it is forced to be true.
|
||||
-->
|
||||
<PublishSelfContained Condition=" '$(PublishSelfContained)' == '' ">false</PublishSelfContained>
|
||||
<PublishSelfContained Condition=" '$(PublishSelfContained)' == '' and $([MSBuild]::VersionLessThan($(NETCoreSdkVersion), '9.0')) ">false</PublishSelfContained>
|
||||
<AndroidLinkMode Condition=" '$(AndroidLinkMode)' == '' and '$(PublishTrimmed)' == 'true' ">SdkOnly</AndroidLinkMode>
|
||||
<AndroidLinkMode Condition=" '$(AndroidLinkMode)' == '' ">None</AndroidLinkMode>
|
||||
<!-- For compat with user code not marked trimmable, only trim opt-in by default. -->
|
||||
|
|
Загрузка…
Ссылка в новой задаче