Chyba NuGet NU5051

Scénář 1

Projekt má několik aliasů cílové architektury, které se přeloží na stejnou efektivní architekturu, a balíček nedokáže určit, který alias by měl přispět k vytvoření výstupu, závislostí nebo odkazů na architekturu balíčku.

Problém

Projekt podobný následujícímu má dva aliasy (apple a banana) , které se oba přeloží na 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>

Když spustíte dotnet pack, NuGet vyvolá NU5051, protože nemůže obsahovat duplicitní výstupní sestavení nebo skupiny závislostí pro stejnou architekturu v jednom balíčku.

Řešení

Nastavte IncludeBuildOutput na false a SuppressDependenciesWhenPacking na true všechny kromě jednoho aliasu na efektivní architekturu. To říká NuGetu, který alias přispívá k výstupu sestavení a závislostem.

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

Pokud mají aliasy různé FrameworkReference položky, použijte PrivateAssets="all" odkazy na architekturu v sekundárních aliasech k potlačení z balíčku.

Scénář 2

Projekt má aliasy pro sestavení specifická pro modul runtime a chce umístit výstup sestavení každého aliasu do vlastní cesty balíčku (například runtimes/<rid>/lib/<tfm>/).

Problém

Projekt podobný následujícímu má net10.0 jako primární alias a linuxios jako sekundární aliasy. Všechny tři se přeloží na stejnou efektivní architekturu:

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

Spuštění dotnet pack vyvolá NU5051, protože tři aliasy vytvářejí výstup sestavení a závislosti pro stejnou architekturu.

Řešení

Potlačit výchozí výstup sestavení a závislosti pro sekundární aliasy a použít TargetsForTfmSpecificContentInPackage k umístění sestavení sekundárních aliasů do vlastních cest balíčků:

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

Díky této konfiguraci net10.0 přispívá výchozí lib/net10.0/ výstup sestavení a závislosti, zatímco linux a ios umístěte jejich sestavení do runtimes/linux/lib/net10.0/ a runtimes/ios/lib/net10.0/ v uvedeném pořadí.

Další informace o cílení na více verzí s duplicitními architekturami najdete v tématu Cílení na více architektur. Další informace o rozšiřitelnosti balíčků najdete v tématu Cíl balíčku.