Не включайте зависимости из файла package.config при создании пакета NuGet - программирование
Подтвердить что ты не робот

Не включайте зависимости из файла package.config при создании пакета NuGet

Я использую Nuget для создания пакетов. Я хотел бы создать пакет, который не содержит никаких зависимостей (в файле .nuspec) для любых других пакетов NuGet. Мой проект имеет зависимости NuGet, определенные в файле packages.config.

Сначала я создаю файл .nuspec...

C:\code\MySolution>.nuget\nuget.exe spec MyProject\MyProject.csproj

Я редактирую сгенерированный файл .nuspec минимальным, без зависимостей.

<?xml version="1.0"?>
<package >
  <metadata>
    <id>MyProject</id>
    <version>1.2.3</version>
    <title>MyProject</title>
    <authors>Example</authors>
    <owners>Example</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Example</description>
    <copyright>Copyright 2013 Example</copyright>
    <tags>example</tags>
    <dependencies />
  </metadata>
</package>

Затем я создаю решение и создаю пакет NuGet...

C:\code\MySolution>.nuget\nuget.exe pack MyProject\MyProject.csproj -Verbosity detailed

Вот результат этой команды...

Attempting to build package from 'MyProject.csproj'.
Packing files from 'C:\code\MySolution\MyProject\bin\Debug'.
Using 'MyProject.nuspec' for metadata.
Found packages.config. Using packages listed as dependencies

Id: MyProject
Version: 1.2.3
Authors: Example
Description: Example
Tags: example
Dependencies: Google.ProtocolBuffers (= 2.4.1.473)

Added file 'lib\net40\MyProject.dll'.

Successfully created package 'C:\code\MySolution\MyProject.1.2.3.nupkg'.

Созданный пакет .nupkg содержит файл .nuspec, содержащийся в нем, но включает раздел зависимостей, который у меня не был в исходном файле .nuspec...

<dependencies>
  <dependency id="Google.ProtocolBuffers" version="2.4.1.473" />
</dependencies>

Я считаю, что это происходит из-за этого... (из вышесказанного)

Found packages.config. Using packages listed as dependencies

Как я могу сделать NuGet не автоматически разрешать зависимости и вставлять их в файл .nuspec, который генерируется командой pack?

В настоящее время я использую NuGet 2.2. Кроме того, я не думаю, что такое поведение произошло в более старой версии NuGet; это новая "особенность"? Я не мог найти документацию, описывающую эту "функцию" или когда она была реализована.

4b9b3361

Ответ 2

Предотвратите зависание вашего пакета от других пакетов

В NuGet 2.7 есть новый атрибут developmentdependency, который может быть добавлен в package node в ваш проект packages.config файл. Поэтому, если ваш проект включает пакет NuGet, который вам не нужен, чтобы ваш пакет NuGet включался в качестве зависимости, вы можете использовать этот атрибут следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="CreateNewNuGetPackageFromProjectAfterEachBuild" version="1.8.1-Prerelease1" targetFramework="net45" developmentDependency="true" />
</packages>

Важным битом, который вам нужно добавить, является developmentDependency="true".

Предотвратить зависание вашего пакета разработки другими пакетами

Если вы создаете пакет разработки NuGet для других, чтобы вы их потребляли, вы знаете, что они не захотят иметь зависимость от своих пакетов, тогда вы можете избежать того, чтобы пользователи вручную добавляли этот атрибут в свой файл packages.config используя атрибут NuGet 2.8 developmentDependency в разделе метаданных вашего файла .nuspec. Это автоматически добавит атрибут developmentDependency в файл package.config, когда ваш пакет будет установлен другими. Ловушка здесь заключается в том, что для этого требуется, чтобы пользователь установил хотя бы NuGet 2.8. К счастью, мы можем использовать атрибут NuGet 2.5 minClientVersion, чтобы убедиться, что у пользователей установлено не менее v2.8; в противном случае они будут уведомлены, что им необходимо обновить свой клиент NuGet до того, как они смогут установить пакет.

У меня есть пакет разработки NuGet, для которого это было идеально. Вот как выглядит мой файл .nuspec, показывающий, как использовать атрибуты minClientVersion и developmentDependency (строки 3 и 20 соответственно):

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
  <metadata minClientVersion="2.8">
    <id>CreateNewNuGetPackageFromProjectAfterEachBuild</id>
    <version>1.8.1-Prerelease1</version>
    <title>Create New NuGet Package From Project After Each Build</title>
    <authors>Daniel Schroeder,iQmetrix</authors>
    <owners>Daniel Schroeder,iQmetrix</owners>
    <licenseUrl>https://newnugetpackage.codeplex.com/license</licenseUrl>
    <projectUrl>https://newnugetpackage.codeplex.com/wikipage?title=NuGet%20Package%20To%20Create%20A%20NuGet%20Package%20From%20Your%20Project%20After%20Every%20Build</projectUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Automatically creates a NuGet package from your project each time it builds. The NuGet package is placed in the project output directory.
    If you want to use a .nuspec file, place it in the same directory as the project project file (e.g. .csproj, .vbproj, .fsproj).
    This adds a PostBuildScripts folder to your project to house the PowerShell script that is called from the project Post-Build event to create the NuGet package.
    If it does not seem to be working, check the Output window for any errors that may have occurred.</description>
    <summary>Automatically creates a NuGet package from your project each time it builds.</summary>
    <releaseNotes>- Changed to use new NuGet built-in method of marking this package as a developmentDependency (now requires NuGet client 2.8 or higher to download this package).</releaseNotes>
    <copyright>Daniel Schroeder 2013</copyright>
    <tags>Auto Automatic Automatically Build Pack Create New NuGet Package From Project After Each Build On PowerShell Power Shell .nupkg new nuget package NewNuGetPackage New-NuGetPackage</tags>
    <developmentDependency>true</developmentDependency>
  </metadata>
  <files>
    <file src="..\New-NuGetPackage.ps1" target="content\PostBuildScripts\New-NuGetPackage.ps1" />
    <file src="Content\NuGet.exe" target="content\PostBuildScripts\NuGet.exe" />
    <file src="Content\BuildNewPackage-RanAutomatically.ps1" target="content\PostBuildScripts\BuildNewPackage-RanAutomatically.ps1" />
    <file src="Content\UploadPackage-RunManually.ps1" target="content\PostBuildScripts\UploadPackage-RunManually.ps1" />
    <file src="Content\UploadPackage-RunManually.bat" target="content\PostBuildScripts\UploadPackage-RunManually.bat" />
    <file src="tools\Install.ps1" target="tools\Install.ps1" />
    <file src="tools\Uninstall.ps1" target="tools\Uninstall.ps1" />
  </files>
</package>

Если вы не хотите, чтобы ваши пользователи имели хотя бы NuGet v2.8, прежде чем они могли использовать ваш пакет, вы можете использовать решение, которое я придумал, и blogged about до того, как появился атрибут nuGet 2.8 developmentdependency.

Ответ 3

Вы можете явно указать, какие файлы включить, а затем запустить команду pack в самом файле nuspec.

<?xml version="1.0"?>
<package >
  <metadata>
    <id>MyProject</id>
    <version>1.2.3</version>
    <title>MyProject</title>
    <authors>Example</authors>
    <owners>Example</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Example</description>
    <copyright>Copyright 2013 Example</copyright>
    <tags>example</tags>
    <dependencies />
  </metadata>

  <files>
    <file src="bin\Release\MyProject.dll" target="lib" />
  </files>

</package>

Вы должны установить атрибут src с помощью пути, который находится здесь относительно файла nuspec. Затем вы можете запустить команду pack.

nuget.exe pack MyProject\MyProject.nuspec

Ответ 4

В соответствии с выпуском № 1956 (https://nuget.codeplex.com/workitem/1956) и вытащите запрос 3998 (https://nuget.codeplex.com/SourceControl/network/forks/adamralph/nuget/contribution/3998) эта функция была включена в релиз 2.4 release 2.7.

Однако я не могу найти документацию об этой функции, и я до сих пор не понял, как ее использовать. Пожалуйста, обновите этот ответ, если кто знает.

Обновление: выпуск № 1956 был обновлен разработчиком. Эта функция не была включена в выпуск 2.4, но отложена до предстоящей версии 2.7. Вот почему он еще не задокументирован.

Ответ 5

Если вы используете PackageReference вместо файла package.config, вот решение:

<PackageReference Include="Nerdbank.GitVersioning" Version="1.5.28-rc" PrivateAssets="All" />

или

<PackageReference Include="Nerdbank.GitVersioning" Version="1.5.28-rc">
   <PrivateAssets>all</PrivateAssets>
</PackageReference>

Связанное обсуждение GitHub

Ответ 6

Я не уверен, почему вы хотите игнорировать зависимости, которые должен выполнить ваш пакет NuGet, но подумали ли вы об использовании NuGet Package Explorer вместо этого, чтобы создать свой пакет?