Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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).