Создание пакета Nuget, не включая ссылочные DLL

Я использую версию сообщества Visual Studio 2019 и консоль диспетчера пакетов. Я использую .net core 2.2, и ссылки на пакеты включены. Я хочу иметь возможность создать один пакет nuget coreproj1, который также будет включать библиотеки DLL для Coreproj2 и coreProj3, без необходимости упаковывать CoreProj2 и CoreProj3, поскольку существует много проектов, и упаковка их всех невозможна. Я искал в Интернете и не могу найти четкого решения, так как не многие из них используют ссылку на пакет.

  CoreProj1 references CoreProj2 and CoreProj3 
  CoreProj2 and CoreProj3 do not reference anything

сейчас я использую

   dotnet pack "full project path" --output "outputPath" 

Когда я пытаюсь установить пакет, я получаю следующую ошибку (такая же ошибка для CoreProj3)

  Error NU1101  Unable to find package CoreProj2. No packages exist with this id in source(s): LocalPackages, Microsoft Visual Studio Offline Packages, nuget.org,  TestNuget   source\repos\TestNuget\TestNuget\TestNuget.csproj   1

person UndeadEmo    schedule 24.05.2019    source источник


Ответы (2)


Включение ссылочных сборок проектов с использованием целей пакета MSBuild (dotnet pack фактически является просто псевдонимом для dotnet msbuld -t:pack) не поддерживается. . nuget.exe pack имеет аргумент IncludeReferencedProjects, который делает то, что вы хотите, но не работает правильно для проектов, использующих PackageReference или проекты в стиле SDK (которые всегда PackageReference).

Одним из возможных обходных путей является создание сценария сборки, который сначала создает все ваши проекты, затем копирует все ваши сборки в макет пакета nuget и использует nuget.exe pack для упаковки этого макета каталога.

Другим обходным решением является использование nuspec с набором элементов <file src="..." target="lib\<tfm>\">, которые сообщают NuGet о необходимости упаковать все сборки из их скомпилированных местоположений.

Другой обходной путь — использовать расширяемость MSBuild, чтобы сообщать целевым объектам MSBuils NuGet о сборках, которые вы хотите упаковать после сборки, но перед упаковкой. В приведенной выше ветке есть несколько комментариев, в которых приведены примеры того, как это можно сделать.

person zivkan    schedule 25.05.2019

Вот репродукция:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <PackageId>CoreProj1</PackageId>
    <Description>CoreProj1</Description>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="..\CoreProj2\CoreProj2.csproj" />
    <ProjectReference Include="..\CoreProj3\CoreProj3.csproj" />
  </ItemGroup>
</Project>

Тогда и Proj2, и 3 имеют одинаковый контент:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <IsPackable>false</IsPackable>
  </PropertyGroup>
</Project>

Запуск dotnet pack для первого приводит к пакету, в котором нет сборок ни для одного из упомянутых проектов.

Исправление заключается в установке NuGetizer (отказ от ответственности: это был проект, первоначально созданный Xamarin/Microsoft мной и затем как бы заброшен, пока я не разветвил его и не стал владельцем):

<ItemGroup>
  <PackageReference Include="NuGetizer" Version="0.5.0" />
</ItemGroup>

После его установки и повторного запуска dotnet pack все три проекта будут правильно упакованы. Кроме того, вы также можете установить глобальный инструмент dotnet nugetize, чтобы вы могли очень быстро проверить, что будет упаковано, не тратя время на сборку:

dotnet tool install -g dotnet-nugetize

Затем просто запустите nugetize из папки проекта:

❯ nugetize
Package: CoreProj1.1.0.0.nupkg
        C:\Temp\corepack\CoreProj1\bin\CoreProj1.nuspec
    Authors    : CoreProj1
    Description: CoreProj1
    Version    : 1.0.0
Contents:
    /lib/
    net5.0/
        CoreProj1.dll
        CoreProj1.pdb
        CoreProj2.dll
        CoreProj2.pdb
        CoreProj3.dll
        CoreProj3.pdb

Который использует тонкую окраску в консоли, чтобы сделать его лучше:

введите здесь описание изображения

person kzu    schedule 04.12.2020