Сразу к делу: проще всего упаковать проект так = ›

dotnet pack "path/to/your/PROJECT/folder" --include-symbols --force --output "path/to/your/NUGETS/folder" --runtime "net461" -p:PackageVersion="1.0.0"

Но есть и другие вопросы, которые следует учитывать, которые будут рассмотрены в оставшейся части статьи.

Эээ ... но «dotnet pack» не позволяет мне добавить «Автор»!

Да и нет: эти другие поля теперь должны быть помещены в файл .csprjo, например:

<PropertyGroup>
    <TargetFrameworks>net461;netcoreapp2.0</TargetFrameworks>
    <Authors>Xavier Penya</Authors>
    <Company>MyCompany</Company>
</PropertyGroup>

Пакет не работает, если у меня несколько проектов

dotnet pack просто упаковывает один проект. Он не упаковывает все зависимости своего проекта, он просто говорит: «Эй, этот пакет, который я создаю, имеет все эти другие зависимости». Вот почему, когда вы загружаете свой новый пакет в другой проект, NuGet ожидает найти все зависимые от него пакеты nuget (сторонние пакеты, а также ваши собственные другие проекты, на которые есть ссылки в вашем основном проекте). Если он не находит их все, он даже не завершает установку вашего пакета.

Чтобы решить эту ошибку, у вас есть как минимум 2 варианта:

Вариант 1: создать N пакетов nuget

То есть: один пакет nuget для каждой зависимости, например:

:: From the command line:
SET PACKAGE_VERSION=%1
SET OUTPUT_DIRECTORY="path/to/your/NUGETS/directory"
SET RUNTIME="net461"
dotnet pack "path/to/proj/depenency/1" --include-symbols --force --output %OUTPUT_DIRECTORY% --runtime %RUNTIME% -p:PackageVersion=%PACKAGE_VERSION%
dotnet pack "path/to/proj/depenency/2" --include-symbols --force --output %OUTPUT_DIRECTORY% --runtime %RUNTIME% -p:PackageVersion=%PACKAGE_VERSION%
dotnet pack "path/to/proj/depenency/3" --include-symbols --force --output %OUTPUT_DIRECTORY% --runtime %RUNTIME% -p:PackageVersion=%PACKAGE_VERSION%

Вариант 2 [рекомендуется]: изменить .csproj

Решение пришло из этого комментария (не забудьте установить PrivateAssets="All" для каждой ссылки на проект!):

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;net47</TargetFrameworks>
    <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\ClassLibrary2\ClassLibrary2.csproj" PrivateAssets="all" />
    <ProjectReference Include="..\ClassLibrary3\ClassLibrary3.csproj" Condition="'$(TargetFramework)' == 'net47'" PrivateAssets="all" />
  </ItemGroup>

  <Target Name="CopyProjectReferencesToPackage" DependsOnTargets="ResolveReferences">
    <ItemGroup>
      <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))" />
    </ItemGroup>
  </Target>
</Project>

Почему NuGetPack () CakeBuild не работает

Эээ ... я не знаю. Но это не так.

Сборка прошла успешно, но когда пакет nuget был установлен в другом коде, возникла эта ошибка времени выполнения: Could not load file or assembly System.Runtime, Version=4.2.0.0. Поэтому, спросив о StackOverflow, пользователь предложил мне попробовать dotnet pack. И это решило проблему.

Итак, как мне объединить «dotnet pack» с CakeBuild?

Вы можете заменить это:

NuGetPack(nuGetPackSettings);

Этим:

StartProcess("pack.bat", "1.0.0");

… Где pack.bat код выглядит следующим образом:

:: From the command line:
SET PACKAGE_VERSION=%1
SET SRC_PATH="path/to/your/PROJECT/folder"
SET OUTPUT_DIRECTORY="path/to/your/NUGETS/folder"
SET RUNTIME="net461"
dotnet pack %SRC_PATH% --include-symbols --force --output %OUTPUT_DIRECTORY% --runtime %RUNTIME% -p:PackageVersion=%PACKAGE_VERSION%