Создание пакета Nuget Исключить папку lib

Я пытаюсь создать пакет nuget с файлом .nuspec. У нас есть несколько проектов под одной крышей, и мы пытаемся создать nLog.config (и файлы преобразования) и распространить его через пакет nuget. Для любой версии .Net Framework я ищу один и тот же набор файлов конфигурации (только конфигурации без dll). Так что мне действительно не нужны \ lib \ net45 \ myproject.dll или \ lib \ net40 \ myproject.dll. Хотя, когда я создаю пакет nuget, он всегда создает папку lib и включает dll. Какого рода создать зависимость для любого проекта, связанного с версией .NET Framework.

Ниже мой файл nuspec на случай, если кто-то захочет сослаться, если я что-то делаю не так. Я пробовал "" и еще кое-что, но безуспешно.

<?xml version="1.0"?>
<package >
  <metadata>
    <id>NLogConfig</id>
    <version>1.0.3</version>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <copyright>Copyright 2013</copyright>
    <dependencies>
      <dependency id="NLog" version="2.1.0" />
      <dependency id="NLog.Schema" version="2.1.0" />
    </dependencies>
  </metadata>
  <files>    
    <file src="NLog.config" target="content" />
    <file src="NLog.Debug.config" target="content" />
    <file src="NLog.UAT.config" target="content" />
    <file src="NLog.Release.config" target="content" />
    <file src="tools\*.*" target="tools"/>          
  </files>
</package>

Как я могу полностью исключить папку lib с помощью файла nuspec (предпочтительно) или другого механизма? Спасибо !!

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

Обновление 1:

Я пытался красться, но безуспешно. Я поставил событие post build и попытался удалить DLL. Но почему-то система была умной, она выдала мне ошибку «Ошибка 79 Не удалось найти 'C: \ GITRepo \ NLogConfig \ NLogConfig \ bin \ Release \ NLogConfig.dll'. Убедитесь, что проект построен».

Обновление 2

Я не нашел способа использовать .csproj для создания пакета nuget, но, используя внешнюю команду и указав файл nuspec, я смог добиться тех же результатов. Вопрос все еще остается, это только мое решение.


person TorontoKid    schedule 02.12.2013    source источник


Ответы (8)


Хотел поделиться своим опытом. Мне нужно было использовать csproj в качестве целевого объекта Nuget.exe (поскольку я хотел, чтобы NuGet автоматически разрешал зависимости), а в результирующем пакете не было папки lib. Чтобы пропустить эту папку, я использовал следующую команду:

nuget pack <projectPath> -Exclude bin/**/*.*
person AndreyCh    schedule 19.04.2017
comment
Это действительно сработало, и его следует отметить как ответ. - person Peter Ivan; 26.10.2017
comment
nuget.exe: невозможно создать пакет без зависимостей и содержимого. Это неправильно, потому что ‹files› используется для заполнения папки инструментов. - person Sam Rueby; 05.03.2018
comment
Убедитесь, что вы установили правильные пути для этих файлов, похоже, NuGet не может получить к ним доступ. Если вы используете обратную косую черту в качестве разделителя пути, попробуйте заменить ее косой чертой. - person AndreyCh; 05.03.2018
comment
Работает отлично. +1 от меня. - person Vimalan Jaya Ganesh; 27.10.2020

Используйте параметр команды NuGet Pack -Tool. См. https://docs.microsoft.com/en-us/nuget/tools/cli-ref-pack.

«Определяет, должны ли выходные файлы проекта находиться в папке инструмента».

person Tomáš Veselý    schedule 30.05.2015
comment
Это, безусловно, предотвращает установку выходных данных в качестве зависимостей в целевом проекте (том, к которому добавлен пакет NuGet), но все же приводит к тому, что выходные данные устанавливаются в папку tools ... Однако мне больше нравится подход Дэвида Эванса. , поскольку он включает конфигурацию в пакет .nuget, а не изменяет синтаксис пакета nuget.exe. stackoverflow.com/a/30883992/3063884 - person CJBS; 18.01.2018
comment
Фактически это закончилось созданием папки инструментов. это не помогает - person Long Do Thanh; 21.09.2020

Я решил эту проблему, сначала исключив все файлы из выходной папки моего проекта.

<file src="bin\**\*.*" target="lib\net451" exclude="bin\**\*.*" />

А затем при фактической упаковке через NuGet.exe я нацелился на свой .nuspec, а не на мой csproj. Полученный пакет не содержал выходной dll моего проекта в папке / lib.

person Dav Evans    schedule 17.06.2015
comment
Это хорошо, и, как уже упоминалось, необходимо настроить таргетинг на .nuspec. Нацеливание на .csproj приводит к включению папки lib. Мне нравится этот подход, потому что он не требует изменения синтаксиса команды nuget, а не требует его включения в файл .nuspec. - person CJBS; 18.01.2018

Это ожидаемое поведение, когда вы упаковываете проект, поскольку все дело в том, что nuget прочитает проект и соответственно сгенерирует пакет. И любой найденный .nuspec сможет только добавлять контент, но не удалять ранее добавленный.

Итак, вы отмечаете, что ваше второе обновление - это то, что вы должны сделать - вместо этого упаковать .nuspec.

person Alex    schedule 22.03.2015

Вы можете оставить файлы lib включенными в пакет, используя синтаксис exclude. Что-то вроде ниже:

<files>
<file src="bin\Debug\*.*" exclude="bin\Debug\*.dll" />
</files>

Для получения дополнительной информации см. http://docs.nuget.org/docs/reference/nuspec-reference

person Dan Liu    schedule 03.12.2013
comment
Спасибо за ответ, Дэн !! К сожалению, это не сработало. Я думаю, что могу быть неясным в своем вопросе, но я пытаюсь создать пакет как часть процесса сборки Visual Studio, используя ‹BuildPackage› true ‹/BuildPackage› для выпуска и используя ‹Import Project = $ (SolutionDir) \. Nuget \ NuGet.targets Condition = Exists ('$ (SolutionDir) \. Nuget \ NuGet.targets') / ›. Исключение подобных dll по-прежнему включает папку lib и dll, сгенерированные с ее помощью. До сих пор я обнаружил, что единственный вариант - использовать nuspec и создавать пакет извне или помещать ту же команду в событие пост-сборки. - person TorontoKid; 04.12.2013
comment
Возможно, это не сработает, потому что параметр target не включен. - person CJBS; 18.01.2018

вам нужно удалить элемент зависимостей и пока вы не будете использовать проект для создания пакета, nuget добавит ссылку на эти библиотеки

<?xml version="1.0"?>
<package >
  <metadata>
    <id>NLogConfig</id>
    <version>1.0.3</version>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <copyright>Copyright 2013</copyright>
  </metadata>
  <files>    
    <file src="NLog.config" target="content" />
    <file src="NLog.Debug.config" target="content" />
    <file src="NLog.UAT.config" target="content" />
    <file src="NLog.Release.config" target="content" />
    <file src="tools\*.*" target="tools"/>          
  </files>
</package>
person giammin    schedule 04.12.2013
comment
Спасибо за ответ, Джаммин !! К сожалению, у меня это не сработало. - person TorontoKid; 04.12.2013
comment
@TorontoKid, это действительно странно ... как вы генерируете этот пакет? как вы вызываете nuget.exe? - person giammin; 05.12.2013
comment
Если вы измените файл .csproj с помощью ‹Import Project = $ (SolutionDir) \. Nuget \ NuGet.targets Condition = Exists ('$ (SolutionDir) \. Nuget \ NuGet.targets') /› и для данной конфигурации (в моем случае для выпуска), если вы установите ‹BuildPackage› true ‹/BuildPackage›, каждый раз, когда вы создаете выпуск, вы будете получать пакет nuget, сгенерированный в вашей выходной папке. Чтобы он работал, в корневой папке должны быть .nuget \ nuget.config, .nuget \ nuget.exe и .nuget \ nuget.targets. Пожалуйста, дайте мне знать, если это сбивает с толку, и я могу отправить вам подробное письмо со снимками экрана настройки. - person TorontoKid; 06.12.2013
comment
@TorontoKid, я думаю, вам нужно отделить создание пакета от проекта, чтобы он работал - person giammin; 06.12.2013
comment
Спасибо, что посмотрели @ it !! Именно это я и сделал для обходного пути. Я обновил свой вопрос, отредактировав то же самое, что и я не нашел способа использовать .csproj для создания пакета nuget, но с помощью внешней команды и указанием файла nuspec я смог добиться тех же результатов. Вопрос все еще остается, это только мое решение. Еще раз признателен за ваше предложение. - person TorontoKid; 06.12.2013

У меня также возникли проблемы с этим, и моя проблема с вашим обходным путем, который заключается в том, чтобы отделить создание пакета от проекта, заключается в том, что я не могу использовать подстановочные знаки в файле nuspec. Мое решение - использовать сценарий install.ps1 PowerShell, который запускается после добавления пакета в проект. Однако вам необходимо сначала установить ExecutionPolicy в консоли диспетчера пакетов, чтобы можно было запускать сценарии PowerShell.

param($installPath, $toolsPath, $package, $project)
$project.Object.References | Where-Object { $_.Name -eq 'NLogConfig' } | ForEach-Object { $_.Remove() }

Мне действительно не нравится этот обходной путь, потому что он не будет работать на машинах, где ExecutionPolicy ограничен, что является значением по умолчанию.

person Donn R    schedule 12.08.2014

Итак, у меня была такая же проблема, мне было все равно, была ли включена .dll, но была ли она выпущена с .cs в моем контенте, так как тогда класс будет существовать как в контенте, который был добавлен в целевой проект, так и в DLL, которая была добавлен при установке пакета (предполагая, что вы делаете что-то в том же духе).

Я закончил тем, что изменил действие сборки для файлов .cs, которые были в папке содержимого, на NONE, чтобы они не попали в DLL.

ПРИМЕЧАНИЕ. при этом ни один из кодов в CS-файле не проверяется, поэтому вы захотите сделать это в качестве последнего шага, когда будете уверены, что все в порядке.

Было бы неплохо полностью исключить DLL, но это был мой обходной путь, использующий проект в качестве сборки.

Надеюсь, это кому-то поможет

person workabyte    schedule 05.12.2014