Сразу к делу: проще всего упаковать проект так = ›
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%