Не включайте зависимости из файла packages.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; это новая «особенность»? Я не смог найти никакой документации, описывающей эту «функцию» или когда она была реализована.


person Jesse Webb    schedule 21.02.2013    source источник
comment
Удалите файл packages.config или переименуйте его. Тогда операция pack игнорирует зависимости. Это мой временный обходной путь до выпуска 2.7.   -  person Razor    schedule 30.07.2013
comment
Кто-нибудь ответил на это рабочим ответом. Возможно, отсутствие этой способности - самая глупая вещь, с которой я когда-либо сталкивался.   -  person iGanja    schedule 31.08.2013
comment
Для меня я не могу заставить его включать мои зависимости :(   -  person Poul K. Sørensen    schedule 12.12.2013
comment
Мне тоже не удалось включить свои зависимости. Годами. Я начинаю думать, что это большая выдумка.   -  person StingyJack    schedule 01.05.2017
comment
Используйте флаг -IncludeReferencedProjects в вашей команде пакета, чтобы автоматически включать зависимости, хотя их удаление не очень помогает.   -  person Vern D.    schedule 03.03.2018


Ответы (6)


В версии 2.7 есть опция developmentDependency, которую можно установить в package.config, чтобы избежать включения зависимостей.

<?xml version="1.0" encoding="utf-8"?>
<packages>
    <package id="jQuery" version="1.5.2" />
    <package id="netfx-Guard" version="1.3.3.2" developmentDependency="true" />
    <package id="microsoft-web-helpers" version="1.15" />
</packages>
person David C    schedule 05.09.2013
comment
Готовая реализация этой функции требует, чтобы каждый пользователь пакета добавлял этот атрибут в свой файл packages.config для каждого проекта, в который они его включают. Многие пользователи даже не знают об этом атрибуте. Я писал в блоге о том, как автор пакета может автоматически выполнить этот шаг во время установки своего пакета, сняв ответственность с пользователей, на blog.danskingdom.com/ - person deadlydog; 19.09.2013
comment
@deadlydog В Nuget 2.8 теперь вы можете объявить свой пакет зависимостью, предназначенной только для разработки, установив developmentDependency в true в nuspec. См. docs.nuget.org/docs/reference/nuspec-reference#Metadata_Section - person theDmi; 16.07.2014
comment
@theDmi Да, я недавно обновил сообщение в блоге и опубликовал свой ответ в этой теме со всей обновленной информацией. Не стесняйтесь голосовать за мой ответ, поскольку он содержит четкие примеры и гораздо больше информации, чем этот. - person deadlydog; 16.07.2014

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

Начиная с NuGet 2.7, появился новый атрибут developmentDependency, который может быть добавлено в узел package в 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, используя < a href = "http://docs.nuget.org/docs/release-notes/nuget-2.8#Development_Dependencies"> атрибут NuGet 2.8 developmentDependency в разделе метаданных вашего файла .nuspec. Это автоматически добавит атрибут developmentDependency в файл packages.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's output directory.
    If you want to use a .nuspec file, place it in the same directory as the project's 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's 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, прежде чем они смогут использовать ваш пакет, вы можете используйте решение, которое я придумал и о котором писал в блоге до того, как появился атрибут NuGet 2.8 developmentDependency.

person deadlydog    schedule 14.06.2014
comment
У меня не получилось. Nuget 2.8 здесь, а developmentDependency = true не имеет значения. Когда я смотрю на пакет через диспетчер Nuget, он по-прежнему сообщает обо всех этих внешних зависимостях и по-прежнему втягивает их в мой проект. - person DiggyJohn; 30.06.2014
comment
@DiggyJohn Хммм, я протестировал его перед публикацией, и он отлично работал у меня. Я тоже использую v2.8. Вы также используете файл .nuspec? Возможно, у вас есть эти дополнительные файлы, перечисленные как зависимости в вашем файле .nuspec? - person deadlydog; 01.07.2014
comment
@DiggyJohn, если у вас уже есть ссылка на ваш пакет, он не будет его обновлять. Мне пришлось удалить ссылку в конфигурации моего пакета, затем переустановить пакет, и он появился, как ожидалось - person workabyte; 06.08.2014
comment
При использовании nuget 4.7 ни один из вариантов не предотвращает загрузку зависимостей. - person munchrall; 31.07.2018

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

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

or

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

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

person Philippe    schedule 06.07.2017
comment
Если это не сработает, попробуйте удалить папки bin и obj. - person Tereza Tomcova; 01.10.2018

Вы можете явно указать, какие файлы включать, а затем запустить команду 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
person Ufuk Hacıoğulları    schedule 21.02.2013
comment
Это интересный подход, который я не рассматривал; Я попробую это решение позже, когда у меня будет время. У меня создалось впечатление, что использовать .nuspec файлы для генерации пакетов - не лучшая идея; было предпочтительнее использовать .csproj файлы. Есть ли какие-то последствия для такой сборки пакетов? - person Jesse Webb; 22.02.2013
comment
@JesseWebb Я думаю, вы не можете заполнить некоторые поля, такие как версия, с использованием переменных, но в остальном все должно быть в порядке. Я думаю, что нет ничего плохого в использовании файла nuspec. Есть ли у вас источник, который утверждает обратное? - person Ufuk Hacıoğulları; 01.03.2013
comment
Я думаю, это не рекомендуется специально; документ NuGet просто говорит об использовании файла csproj в команде pack, и на самом деле nuspec будет получен. docs.nuget.org/docs/creating- packages / Тем не менее, это решение кажется многообещающим, я попробую его как можно скорее ... Последние пару недель меня просто завалили. - person Jesse Webb; 02.03.2013
comment
Спецификация @DiggyJohn могла быть изменена в более поздней версии. docs.nuget.org/docs/reference/nuspec-reference - person Ufuk Hacıoğulları; 30.06.2014
comment
Ссылка на .nuspec вместо .csproj будет работать (т. Е. Не будет включать зависимости, которые вы явно не указали). Обратной стороной является то, что стандартные заменяющие токены не обрабатываются, например $ version $ не будет присвоено значение в AssemblyInfo.cs проекта. Обратитесь к docs.microsoft.com/en-us/nuget/schema / nuspec # замещающие токены - person stoj; 22.09.2017

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

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

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

person Eivind Gussiås Løkseth    schedule 13.05.2013
comment
Проблема была обновлена ​​недавно. Эта функция, похоже, была протестирована, и обнаружено несколько проблем. nuget.codeplex.com/workitem/1956 - person Eivind Gussiås Løkseth; 17.07.2013

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

person devdigital    schedule 21.02.2013
comment
Наш процесс сборки автоматизирован нашим CI-сервером TeamCity, поэтому мы не рассматривали возможность использования инструмента с графическим интерфейсом в этом процессе. Я не думаю, что этот инструмент поможет нам это автоматизировать. - person Jesse Webb; 22.02.2013
comment
Причина, по которой нам не нужна зависимость, включенная в .nuspec, заключается в том, что мы используем только GoogleProtocolBuffers для создания соответствующих исходных файлов C #; это не зависимость во время выполнения. - person Jesse Webb; 22.02.2013
comment
Вы можете использовать этот инструмент для создания и поддержки файла .nuspec, а затем сгенерировать пакет из файла .nuspec непосредственно на вашем сервере сборки, а не из .csproj - person devdigital; 22.02.2013
comment
Ясно ... вы предлагаете использовать этот инструмент для поддержки файла .nuspec, аналогичного тому, что @ UfukHacıoğulları предложил в своем ответе. Я попробую поэкспериментировать с его решением. - person Jesse Webb; 22.02.2013
comment
В нашем случае это потому, что мы используем ILMerge на нескольких сборках. Нам не нужно, чтобы Nuget извлекал все зависимые сборки, потому что они уже являются частью основной сборки и больше не зависят от них. - person DiggyJohn; 30.06.2014