Подтвердить что ты не робот

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

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

Ниже мой файл 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 (Preferred) или другой механизм? Спасибо!

enter image description here

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

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

Обновление 2

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

nuget pack <projectPath> -Exclude bin/**/*.*

Ответ 3

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

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

И затем, когда на самом деле упаковка через NuGet.exe, я нацелился на мой .nuspec и не мой csproj. В результате пакет не содержал мою DLL-версию проекта в папке/lib.

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

<?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>

Ответ 7

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

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

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

Ответ 8

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

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

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

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

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