Ошибка NuGet NU5051

Сценарий 1

Проект имеет несколько псевдонимов целевой платформы, которые разрешаются в одну и ту же эффективную платформу, и пакет не может определить, какой псевдоним должен вносить выходные данные сборки, зависимости или ссылки платформы на пакет.

Проблема

Проект, как показано ниже, имеет два псевдонима (apple и banana), которые разрешаются как в net10.0:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>apple;banana</TargetFrameworks>
  </PropertyGroup>

  <PropertyGroup>
    <TargetFrameworkIdentifier>.NETCoreApp</TargetFrameworkIdentifier>
    <TargetFrameworkVersion>v10.0</TargetFrameworkVersion>
    <TargetFrameworkMoniker>.NETCoreApp,Version=v10.0</TargetFrameworkMoniker>
  </PropertyGroup>
</Project>

При запуске dotnet packNuGet вызывает NU5051, так как он не может включать повторяющиеся выходные данные сборки или группы зависимостей для одной платформы в одном пакете.

Решение

Задайте IncludeBuildOutput для falseSuppressDependenciesWhenPackingtrue всех псевдонимов, кроме одного псевдонима для каждой эффективной платформы. Это сообщает NuGet, какой псевдоним вносит вклад в выходные данные сборки и зависимости.

  <!-- Let 'apple' contribute the build output and dependencies -->
  <PropertyGroup Condition="'$(TargetFramework)' == 'banana'">
    <IncludeBuildOutput>false</IncludeBuildOutput>
    <SuppressDependenciesWhenPacking>true</SuppressDependenciesWhenPacking>
  </PropertyGroup>

Если псевдонимы имеют разные FrameworkReference элементы, используйте PrivateAssets="all" ссылки на платформу в дополнительных псевдонимах, чтобы отключить их из пакета.

Сценарий 2

Проект имеет псевдонимы для сборок, зависящих от среды выполнения, и хочет поместить выходные данные сборки каждого псевдонима в путь к пользовательскому пакету (например, runtimes/<rid>/lib/<tfm>/).

Проблема

Проект, как показано ниже, имеет net10.0 основной псевдоним и linuxios в качестве дополнительных псевдонимов. Все три разрешения для одной эффективной платформы:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net10.0;linux;ios</TargetFrameworks>
  </PropertyGroup>

  <PropertyGroup Condition="'$(TargetFramework)' == 'linux' OR '$(TargetFramework)' == 'ios' OR '$(TargetFramework)' == 'net10.0'">
    <TargetFrameworkIdentifier>.NETCoreApp</TargetFrameworkIdentifier>
    <TargetFrameworkVersion>v10.0</TargetFrameworkVersion>
    <TargetFrameworkMoniker>.NETCoreApp,Version=v10.0</TargetFrameworkMoniker>
  </PropertyGroup>
</Project>

При выполнении dotnet pack возникает ошибка NU5051, так как три псевдонима создают выходные данные сборки и зависимости для одной и той же платформы.

Решение

Подавляйте выходные данные и зависимости сборки по умолчанию для вторичных псевдонимов и используйте TargetsForTfmSpecificContentInPackage для размещения сборок дополнительных псевдонимов в пользовательские пути пакета:

  <PropertyGroup>
    <TargetsForTfmSpecificContentInPackage>$(TargetsForTfmSpecificContentInPackage);GetMyPackageFiles</TargetsForTfmSpecificContentInPackage>
  </PropertyGroup>

  <PropertyGroup Condition="'$(TargetFramework)' == 'linux' OR '$(TargetFramework)' == 'ios'">
    <IncludeBuildOutput>false</IncludeBuildOutput>
    <SuppressDependenciesWhenPacking>true</SuppressDependenciesWhenPacking>
  </PropertyGroup>

  <Target Name="GetMyPackageFiles">
    <ItemGroup Condition="'$(TargetFramework)' == 'linux' OR '$(TargetFramework)' == 'ios'">
      <TfmSpecificPackageFile Include="$(OutputPath)$(AssemblyName).dll">
        <PackagePath>runtimes/$(TargetFramework)/lib/net10.0</PackagePath>
      </TfmSpecificPackageFile>
    </ItemGroup>
  </Target>

В этой конфигурации net10.0 по умолчанию lib/net10.0/ вносятся выходные данные сборки и зависимости сборки, а также linuxios их сборки и их сборки runtimes/linux/lib/net10.0/runtimes/ios/lib/net10.0/ соответственно.

Дополнительные сведения о многонацелии с повторяющимися платформами см. в разделе "Назначение нескольких платформ". Дополнительные сведения о расширяемости пакетов см. в разделе целевого объекта пакета.