Udostępnij za pośrednictwem


Błąd narzędzia NuGet NU5051

Scenariusz 1

Projekt ma wiele aliasów platform docelowych, które rozpoznają tę samą obowiązującą strukturę, a pakiet nie może określić, który alias powinien współtworzyć dane wyjściowe kompilacji, zależności lub odwołania struktury do pakietu.

Problematyka

Projekt podobny do poniższego ma dwa aliasy (apple i banana), które są rozpoznawane jako 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>

Po uruchomieniu program dotnet packNuGet zgłasza pakiet NU5051, ponieważ nie może uwzględniać zduplikowanych danych wyjściowych kompilacji ani grup zależności dla tej samej struktury w jednym pakiecie.

Rozwiązanie

Ustaw IncludeBuildOutput na false wartość i SuppressDependenciesWhenPacking na true wszystkie, ale jeden alias na efektywną strukturę. Informuje to nuGet, który alias współtworzy dane wyjściowe i zależności kompilacji.

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

Jeśli aliasy mają różne FrameworkReference elementy, użyj PrivateAssets="all" odwołań do platformy w aliasach pomocniczych, aby pominąć je z pakietu.

Scenariusz 2

Projekt zawiera aliasy kompilacji specyficznych dla środowiska uruchomieniowego i chce umieścić dane wyjściowe kompilacji każdego aliasu w niestandardową ścieżkę pakietu (na przykład runtimes/<rid>/lib/<tfm>/).

Problematyka

Projekt podobny do poniższego ma net10.0 jako alias podstawowy i linuxios jako alias pomocniczy. Wszystkie trzy rozwiązania dla tej samej obowiązującej struktury:

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

Uruchomienie dotnet pack wywołuje pakiet NU5051, ponieważ trzy aliasy generują dane wyjściowe kompilacji i zależności dla tej samej platformy.

Rozwiązanie

Pomiń domyślne dane wyjściowe kompilacji i zależności dla aliasów pomocniczych i użyj polecenia TargetsForTfmSpecificContentInPackage , aby umieścić zestawy aliasów pomocniczych w niestandardowych ścieżkach pakietów:

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

Dzięki tej konfiguracji net10.0 współtworzy domyślne lib/net10.0/ dane wyjściowe i zależności kompilacji, a następnie linuxios umieszcza ich zestawy odpowiednio w runtimes/ios/lib/net10.0/ iruntimes/linux/lib/net10.0/.

Aby uzyskać więcej informacji na temat wielowersyjność ze zduplikowanymi strukturami, zobacz Określanie wartości docelowej dla wielu platform. Aby uzyskać więcej informacji na temat rozszerzalności pakietów, zobacz temat Pack target (Obiekt docelowy pakietu).