Пакет NuGet не упаковывает все файлы в выходной каталог. Что мне не хватает?

Я пытаюсь создать пакет NuGet из файла .csproj. Я успешно скомпилировал проект, и в выходной папке содержатся все необходимые файлы (моя сборка и все ее зависимости). Однако кажется, что NuGet помещает в пакет только сборку, созданную с помощью .csproj, а не какие-либо его зависимости. Моя командная строка выглядит так:

nuget pack MyProject.csproj -Property Configuration=Release

и мой полученный файл .nupkg имеет только мою сборку в папке lib. Я успешно заставил NuGet работать для других проектов, но так уж получилось, что этот проект ссылается на блок ведения журнала Enterprise Library, но он НЕ был получен через NuGet. Я не уверен, может ли это быть связано с моей проблемой или нет.

Есть мысли о том, почему он не улавливает зависимости?


person supwar    schedule 09.03.2012    source источник
comment
Я узнал больше о том, что здесь происходит. Очевидно, в версии 1360 ProjectFactory.cs был изменен с захвата всех файлов в выходном каталоге на захват только выходных данных проекта из выходного каталога. Оказалось, что другие мои пакеты сработали только по чистой случайности. В этих случаях так получилось, что имя моих зависимостей начиналось с той же строки, что и имя вывода моего проекта.   -  person supwar    schedule 10.03.2012
comment
Я могу решить свою проблему, просто добавив недостающие зависимости в .nuspec с помощью ‹file›, но это означает, что если зависимости для моего проекта изменятся, мне нужно не забыть вручную обновить мой .nuspec. Должен быть способ получше. Что мне здесь не хватает? Что делают другие люди, чтобы убедиться, что данный пакет имеет все необходимые зависимости, если эти зависимости не исходят от NuGet?   -  person supwar    schedule 10.03.2012
comment
По замыслу, захватывать все в выходном каталоге неправильно, поэтому мы выбрали меньшее зло. Некоторые проекты помещают все выходные двоичные файлы в одну папку (в частности, мы поддерживаем некоторые проекты).   -  person davidfowl    schedule 16.03.2012


Ответы (1)


Если вам нужно автоматически обновлять файл nuspec, на самом деле это просто файл XML (как я уверен, вы знаете), поэтому есть несколько очень хороших инструментов, которые вы можете использовать из MSBuild для автоматизации создания / обновления nuspec. Из коробки MSBuild предоставляет несколько задач, которые могут обновлять или преобразовывать XML, и я использовал задачи сообщества MSBuild для настройки начального nuspec. Например, стандарт nuspec по умолчанию содержит несколько строк с жаропонижающей пластиной, которые мне не нужны, поэтому я использую задачи XmlUpdate для их удаления.

Хотя я не рассматривал сканирование файла csproj на предмет ссылок, не связанных с NuGet, я думаю, что это, вероятно, возможно после небольшого исследования. Вот несколько ссылок на записи блога, описывающие мой опыт автоматизации NuGet, они могут помочь вам начать работу:

Создание пакетов с помощью NuGet в стиле MSBuild - В эту статью включены некоторые базовые обновления NuSpec, поскольку описанный пакет не сильно отличается от типа пакета, который NuGet уже знает, как автоматизировать.

Управляйте частями MEF с помощью Nuget - Эта статья включает в себя несколько более сложных обновлений для поддержки распространения частей MEF в качестве ссылок только на время выполнения.

Если вы планируете делать это много, не хотите связываться с MSBuild или просто хотите вернуть поведение, которое вам понравилось в версии ProjectFactory.cs до 1360, NuGet поддерживает сторонние расширения через MEF. Вы можете войти в систему управления версиями, взять предыдущий код, который вам понравился, и создать собственную команду (например, custompack), которая обеспечивает такое поведение. Затем вы можете использовать его из командной строки следующим образом:

nuget custompack MyProject.csproj -Property Configuration=Release

Я думаю, что это действительно крутой аспект NuGet, но я сам еще не играл с ним. Вот статья, в которой объясняется, как это сделать:

Расширить командную строку NuGet

Поэтому, хотя Дэвид упомянул, что NuGet не предназначен для поддержки этого сценария, если сценарий подходит вам, вы можете пойти по этому пути, чтобы расширить NuGet в соответствии со своими потребностями.

person Jim Counts    schedule 04.04.2012
comment
Спасибо за указатель на расширение командной строки NuGet. Я понятия не имел, что это был вариант - person supwar; 18.05.2012