NuGet-Fehler NU5051

Szenario 1

Ein Projekt verfügt über mehrere Zielframeworkalias, die in dasselbe effektive Framework aufgelöst werden, und das Pack kann nicht bestimmen, welcher Alias zur Buildausgabe, Abhängigkeiten oder Framework-Verweise auf das Paket beitragen soll.

Thema

Ein Projekt wie die folgende hat zwei Aliase (apple und banana) die beide aufgelöst werden: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>

Wenn Sie ausführen dotnet pack, löst NuGet NU5051 aus, da er keine doppelten Buildausgabe- oder Abhängigkeitsgruppen für dasselbe Framework in einem einzigen Paket enthalten kann.

Lösung

Festlegen IncludeBuildOutput auf false und SuppressDependenciesWhenPacking auf true alle Aliase pro effektivem Framework. Dadurch wird NuGet mitgeteilt, welcher Alias zur Buildausgabe und Abhängigkeiten beiträgt.

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

Wenn die Aliase unterschiedliche FrameworkReference Elemente aufweisen, verwenden Sie PrivateAssets="all" die Frameworkverweise in den sekundären Aliasen, um sie aus dem Paket zu unterdrücken.

Szenario 2

Ein Projekt verfügt über Aliase für laufzeitspezifische Builds und möchte die Buildausgabe jedes Alias in einen benutzerdefinierten Paketpfad einfügen (z. B runtimes/<rid>/lib/<tfm>/. ).

Thema

Ein Projekt wie der folgende hat net10.0 den primären Alias und linuxios als sekundäre Aliase. Alle drei auflösen sich zum gleichen effektiven Framework:

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

Die Ausführung dotnet pack löst NU5051 aus, da drei Aliase Buildausgabe und Abhängigkeiten für dasselbe Framework erzeugen.

Lösung

Unterdrücken Sie die Standardmäßige Buildausgabe und Abhängigkeiten für die sekundären Aliase, und verwenden Sie diese TargetsForTfmSpecificContentInPackage , um die Assemblys der sekundären Aliase in benutzerdefinierte Paketpfade zu platzieren:

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

Mit dieser Konfiguration net10.0 trägt die Standardmäßige lib/net10.0/ Buildausgabe und Abhängigkeiten bei, während linux und ios platzieren Sie ihre Assemblys unter runtimes/linux/lib/net10.0/ bzw runtimes/ios/lib/net10.0/ . dort.

Weitere Informationen zu Multiadressierung mit doppelten Frameworks finden Sie unter "Targeting multiple frameworks". Weitere Informationen zur Packerweiterung finden Sie unter Packziel.