Erreur NuGet NU5051

Scénario 1

Un projet a plusieurs alias d’infrastructure cible qui se résolvent vers le même framework effectif, et le pack ne peut pas déterminer quel alias doit contribuer à la sortie, aux dépendances ou aux références d’infrastructure au package.

Problème

Un projet comme celui-ci a deux alias (apple et banana) qui sont tous deux résolus en 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>

Lorsque vous exécutez dotnet pack, NuGet déclenche NU5051, car il ne peut pas inclure de sortie de build en double ou de groupes de dépendances pour le même framework dans un seul package.

Solution

false Définissez IncludeBuildOutput sur et trueSuppressDependenciesWhenPacking sur tous les alias, mais sur un seul alias par framework efficace. Cela indique à NuGet quel alias contribue à la sortie de build et aux dépendances.

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

Si les alias ont des éléments différents FrameworkReference , utilisez PrivateAssets="all" les références d’infrastructure dans les alias secondaires pour les supprimer du package.

Scénario 2

Un projet a des alias pour les builds spécifiques au runtime et souhaite placer la sortie de build de chaque alias dans un chemin d’accès de package personnalisé (par exemple). runtimes/<rid>/lib/<tfm>/

Problème

Un projet comme celui-ci a net10.0 comme alias principal et linux comme ios alias secondaires. Les trois sont résolus dans le même framework efficace :

<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>

L’exécution dotnet pack déclenche NU5051, car trois alias produisent une sortie de build et des dépendances pour le même framework.

Solution

Supprimez la sortie de build et les dépendances par défaut pour les alias secondaires et utilisez cette option TargetsForTfmSpecificContentInPackage pour placer les assemblys des alias secondaires dans des chemins d’accès de package personnalisés :

  <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>

Avec cette configuration, net10.0 contribue à la sortie de build et aux dépendances par défaut lib/net10.0/ , tandis que linux vous ios placez leurs assemblys sous runtimes/linux/lib/net10.0/ et runtimes/ios/lib/net10.0/ respectivement.

Pour plus d’informations sur le ciblage multiple avec des infrastructures en double, consultez Ciblage de plusieurs frameworks. Pour plus d’informations sur l’extensibilité du pack, consultez la cible du pack.