Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Сценарий 1
Проект имеет несколько псевдонимов целевой платформы, которые разрешаются в одну и ту же эффективную платформу, и пакет не может определить, какой псевдоним должен вносить выходные данные сборки, зависимости или ссылки платформы на пакет.
Проблема
Проект, как показано ниже, имеет два псевдонима (apple и banana), которые разрешаются как в 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>
При запуске dotnet packNuGet вызывает NU5051, так как он не может включать повторяющиеся выходные данные сборки или группы зависимостей для одной платформы в одном пакете.
Решение
Задайте IncludeBuildOutput для falseSuppressDependenciesWhenPackingtrue всех псевдонимов, кроме одного псевдонима для каждой эффективной платформы. Это сообщает NuGet, какой псевдоним вносит вклад в выходные данные сборки и зависимости.
<!-- Let 'apple' contribute the build output and dependencies -->
<PropertyGroup Condition="'$(TargetFramework)' == 'banana'">
<IncludeBuildOutput>false</IncludeBuildOutput>
<SuppressDependenciesWhenPacking>true</SuppressDependenciesWhenPacking>
</PropertyGroup>
Если псевдонимы имеют разные FrameworkReference элементы, используйте PrivateAssets="all" ссылки на платформу в дополнительных псевдонимах, чтобы отключить их из пакета.
Сценарий 2
Проект имеет псевдонимы для сборок, зависящих от среды выполнения, и хочет поместить выходные данные сборки каждого псевдонима в путь к пользовательскому пакету (например, runtimes/<rid>/lib/<tfm>/).
Проблема
Проект, как показано ниже, имеет net10.0 основной псевдоним и linuxios в качестве дополнительных псевдонимов. Все три разрешения для одной эффективной платформы:
<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>
При выполнении dotnet pack возникает ошибка NU5051, так как три псевдонима создают выходные данные сборки и зависимости для одной и той же платформы.
Решение
Подавляйте выходные данные и зависимости сборки по умолчанию для вторичных псевдонимов и используйте TargetsForTfmSpecificContentInPackage для размещения сборок дополнительных псевдонимов в пользовательские пути пакета:
<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>
В этой конфигурации net10.0 по умолчанию lib/net10.0/ вносятся выходные данные сборки и зависимости сборки, а также linuxios их сборки и их сборки runtimes/linux/lib/net10.0/runtimes/ios/lib/net10.0/ соответственно.
Дополнительные сведения о многонацелии с повторяющимися платформами см. в разделе "Назначение нескольких платформ". Дополнительные сведения о расширяемости пакетов см. в разделе целевого объекта пакета.