Создайте пакет nuget для решения с несколькими проектами

В настоящее время мы строим решение с несколькими проектами.

У нас есть что-то вроде этого:

- Common
  - Logging
     - Logging.NLog
- Threading

Итак, Logging.NLog зависит от ведения журнала, входа в Common... и т.д.

Когда мы упаковываем Logging.NLog, я бы хотел, чтобы nuget обнаружил Loggin и Common dependecies.

На данный момент я создал пакет с Common, затем в Logging я установил пакет Common с

install-package Common

Но всякий раз, когда я делаю модификацию Common, мне приходится обновлять пакет, и они создаются нашей непрерывной системой интеграции (Hudson), поэтому это довольно раздражает, когда мы разрабатываем.

Я хотел бы просто иметь ссылку на проект (Добавить ссылки → Проект...), и nuget все равно обнаруживает зависимости.

Есть ли способ его достижения?

Ответы

Ответ 1

Существует запланированная функция, нацеленная на этот точный сценарий.

Вот как это будет выглядеть:

> nuget.exe pack proj.csproj -IncludeReferencedProjects

Он, по-видимому, был реализован несколько дней назад, но есть ошибки еще гладил out.

Функция, как она сейчас стоит, позволяет:

  • упаковывать артефакты нескольких проектов в единый пакет nuget (рекурсивно рекурсивно перемещая ссылки проекта),

ИЛИ

  • создание ссылок на пакеты nuget для этих проектов, связанных с пакетами, если связанные проекты содержат файлы .nuspec.

Запрос функции датируется вплоть до 1.5, но он продолжает скользить. В последнее время он собрал достаточно массы (запросов), которые планируются к выпуску в Nuget 2.3.

Планы релиза привязаны к версии 2.3 для "Конец апреля 2013 года", поэтому следите за обновлениями.
(В настоящее время последняя версия Nuget - 2.2.1).

Ответ 2

Я думаю, что Чарльз означает, что он хочет, чтобы NuGet автоматически разрешал ссылки на проекты в зависимости от пакетов, если упомянутые проекты, на которые ссылаются, также используются для создания пакетов NuGet, правильно?

Пример:

  • Ведение журнала настроено для создания пакета NuGet.
  • Logging.Nlog настроен для создания пакета NuGet.
  • Logging.Nlog имеет ссылку на проект для ведения журнала.
  • Сгенерированный пакет Logging.Nlog должен получить зависимость от сгенерированного пакета ведения журнала.

Это то, что я искал сам, но, к сожалению, я обнаружил, что в настоящее время он не поддерживается. На нем есть рабочий элемент, который запланирован для NuGet 1.7, но даже не существует способа управления этим процессом.

Ответ 3

В этой теме есть хорошее предложение: NuGet и несколько решений

В принципе, вырвите общие компоненты в свое решение, со своим собственным жизненным циклом выпуска.

Ответ 4

В настоящее время нет способа выполнить именно то, что вы просите, но следующее поможет вам оптимизировать ваши обновления.

Похоже, вам нужно добавить файлы nuspec в ваше решение. Что-то вроде следующих трех файлов. Обратите внимание на зависимости во втором. Они относятся к той же версии dll, что и обычная версия [$ version $]. Это означает, что при запуске следующей команды он обновляет все три, потому что квадратные скобки в зависимостях требуют определенной версии зависимых пакетов.

PM > общий пакет обновления

В Hudson вам нужно будет выполнить эти файлы nuspec с помощью команды nuget pack (см. ссылку на команду Nuget) и включить результирующие пакеты в ваш артефакты и развертывать их на локальном сервере nuget. Я оставлю это вам.

Другое, что вам нужно сделать, это убедиться, что все ваши сборки получают одну и ту же версию для одной и той же сборки. Опять же, Хадсон может позаботиться об этом, или вы можете использовать общий файл AssemblyInfo.

Common.nuspec

<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
    <version>$version$</version>
    <authors>Charles Ouellet</authors>
    <owners />
    <iconUrl>http://domain/Content/images/LOGO_32x32.png</iconUrl>
    <id>Common</id>
    <title>Common</title>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>full description here</description>
</metadata>
<files>
    <file src="..\Common\bin\Release\Common.dll" target="lib\net40" />
    <file src="..\Common\bin\Release\Common.pdb" target="lib\net40" />
</files>
</package>

Logging.nuspec

<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
    <version>$version$</version>
    <authors>Charles Ouellet</authors>
    <owners />
    <iconUrl>http://domain/Content/images/LOGO_32x32.png</iconUrl>
    <id>Logging</id>
    <title>Logging</title>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>full description here</description>
    <dependencies>
        <dependency id="Common" version="[$version$]" />
    </dependencies>        
</metadata>
<files>
    <file src="..\Logging\bin\Release\Logging.dll" target="lib\net40" />
    <file src="..\Logging\bin\Release\Logging.pdb" target="lib\net40" />
</files>
</package>

Logging.NLog

<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
    <version>$version$</version>
    <authors>Charles Ouellet</authors>
    <owners />
    <iconUrl>http://domain/Content/images/LOGO_32x32.png</iconUrl>
    <id>Logging.NLog</id>
    <title>Logging.NLog</title>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>full description here</description>
    <dependencies>
        <dependency id="Logging" version="[$version$]" />
    </dependencies>        
</metadata>
<files>
    <file src="..\Logging.NLog\bin\Release\Logging.NLog.dll" target="lib\net40" />
    <file src="..\Logging.NLog\bin\Release\Logging.NLog.pdb" target="lib\net40" />
</files>
</package>