Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.