Автоматизация создания пакета NuGet как часть процесса сборки - PullRequest
63 голосов
/ 07 февраля 2012

У меня есть автоматизированный процесс сборки, который я хотел бы расширить, чтобы я мог собирать библиотеки, распространяемые через NuGet.В настоящее время запуск nuget.exe для создания пакетов выполняется вручную.

Каков наилучший способ настройки VS 2010, чтобы мой файл пакета NuGet (* .nupkg) являлся конечным результатомСборка "Release"?

Имейте в виду, что у меня есть другие файлы (контент и инструменты) для некоторых пакетов.И в большинстве случаев у меня есть несколько проектов, объединенных в один пакет NuGet для поддержки .NET 4, Silveright и Phone 7.

(я должен пояснить, что существующий «автоматизированный» процесс является простымсредство запуска пакетных файлов, которое создает решение с использованием командной строки.)

ОБНОВЛЕНИЕ

Я хочу обновить это обсуждение, поскольку проблема не была решена.Хотя предоставленная ссылка @pravin полезна, она не учитывает тот факт, что у меня есть несколько проектов в одном пакете, а также другое содержимое, такое как сценарии PowerShell, преобразования конфигурации и исходного кода и т. Д.

ЛучшийПример, который я могу использовать, - это сборка, которая имеет версии .NET 4 и Silverlight 5.Они распространяются в одном пакете.Я не могу использовать событие после сборки для создания пакета, потому что пакет зависит от ДВУХ проектов.

Ответы [ 9 ]

32 голосов
/ 02 марта 2012

Одной вещью, которая может хорошо работать, является создание собственного файла MSBuild .proj.Вы можете определить пару целей в пользовательском скрипте, первым выполнив компиляцию в вашем решении.Вторая цель для выполнения следующей компиляции будет использовать задачу EXEC MSBuild для вызова утилиты командной строки nuget.exe.Затем вы обновляете свой пакетный исполняющий файл, чтобы он выполнял исполняемый файл msbuild, предоставляя в качестве аргумента ваш пользовательский файл проекта.Возможно, вы уже используете MSBuild в своем пакетном скрипте, что в этом случае будет просто вопросом обмена аргументами.Вы можете включить свой собственный файл proj в элементы решения вашего решения.Если бы вы сделали это, вы могли бы легко добавить ссылку на внешний инструмент в Visual Studio, чтобы быстро протестировать ваш собственный скрипт и убедиться, что он собирает и производит пакет, как вы надеетесь.

Пример MSBuild

Вы можете использовать это как начальное место:

<Project DefaultTargets="Compile" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
    <PropertyGroup>
      <SolutionFile></SolutionFile>
      <NugetExecutable>C:\PathToNuget\nuget.exe</NugetExecutable>
      <NuspecFile></NuspecFile>
    </PropertyGroup>

    <Target Name = "Compile">
        <MSBuild Projects="$(SolutionFile)" Properties="Configuration=Release" />
    </Target>

    <Target Name = "Package">
    <!-- You could use the MSBuild Copy task here to move the compiled code into
           a structure that fits your desired package format -->
      <Exec Command="&quot;$(NugetExecutable)&quot; pack $(NuspecFile)" />
    </Target>
</Project>

Тогда вы бы назвали это как:

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" Build.proj /p:SolutionFile=PathToSolution\App.sln;NuspecFile=foo.nuspec
10 голосов
/ 07 марта 2012

Я делаю то, что вы хотите достичь уже в моем текущем проекте:

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

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

Там я создаю все папки и неизменяемые файлы, необходимые для структуры пакета Nuget.

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

Так и идет:

  • Сборка проекта.
  • Скопируйте вывод обратно в Package \ Lib проекта.
  • Запустить nuget.exe с файлом nuspec в папке пакета.
  • Скопировать результат в выходную папку рядом с оставшейся частью вывода.

Nuget.exe должен находиться либо в фиксированной папке в вашей системе и на сервере сборки (грязное решение), либо включаться в вашу сборку (менее грязную).

Buildscript:

Xcopy.exe /Y "$(TargetPath)" "$(ProjectDir)\Package\Lib" 
cd "$(ProjectDir)Package" 
"$(TargetDir)..\Buildscripts\Nuget.exe" pack MyPackage.nuspec xcopy /Y *.nupkg "$(TargetDir)" 

Чтобы использовать это, единственное, о чем вам нужно позаботиться, - это решить, где зарегистрироваться в nuget.exe. Я создал папку buildscripts на верхнем уровне моего дерева разработки.

7 голосов
/ 14 ноября 2012

Я создал тип проекта NuGet (.nuproj) для расширения Visual Studio под названием NuBuild, который должен делать то, что вы хотите.Это позволяет вам собирать ваши пакеты NuGet из Visual Studio, а также из MSBuild.Вы можете установить его из галереи или получить источник на github .

7 голосов
/ 17 июля 2012

Если вы находитесь в среде TFS 2010, проект NuGetter должен решить проблему автоматического создания пакетов nuget. Он создает один пакет для всей сборки. На самом деле это рабочий процесс сборки TFS 2010, который выполняет работу, вызывая nuget.exe с некоторыми аргументами.

4 голосов
/ 06 марта 2012

Установите пакет NuGet Powertools в свой sln, и он добавит цель сборки для создания nupkg, а затем просто измените ваш CI для выполнения этой задачи. http://nuget.org/packages/NuGetPowerTools

1 голос
/ 31 января 2015

Простое предложение, которое может работать достаточно хорошо ... просто поместите его как событие Postbuild в файл .csproj:

  <PropertyGroup>
    <PostBuildEvent>$(SolutionDir)<YourPathToNugetHere>\NuGet.exe pack $(ProjectPath) -OutputDirectory ..\..\$(OutDir) -IncludeReferencedProjects -Symbols -Properties Configuration=$(Configuration)</PostBuildEvent>
  </PropertyGroup>

Это соберет ваш пользовательский файл .nuspec (который должен быть назван как файл .csproj) и создаст .nupkg.

Вот так.

Вы даже можете сделать это просто в настройках проекта Visual Studio.

1 голос
/ 21 марта 2014

Есть пакет Nuget CreateNewNuGetPackageFromProjectAfterEachBuild , который утверждает, что может делать то, что вы хотите. Существует также документация / сайт проекта.

0 голосов
/ 12 января 2017

Установите пакет Nuget NuGet.for.MSBuild. Файл '.nuspec' не требуется, и необходимая информация будет взята из AssemblyInfo.cs.

Установите сборку в режим «Release». После сборки файл nupkg будет находиться в папке «bin / Release».

https://nuget4msbuild.codeplex.com/

0 голосов
/ 02 марта 2012

Насколько я знаю, вы не можете.

Вместо этого, сделайте это правильно и создайте правильную среду / процесс сборки, которая запускает скрипт сборки при фиксации / отправке в ваш главный репозиторий, который выполняет следующее:

  • Клонирование / извлечение изменений.
  • Построение решения.
  • Сборка пакетов.
  • Загрузка пакетов на сервер пакетов.

Вы можете запустить TeamCity, CruiseControl.NET или другой сервер CI на виртуальной машине или на существующем сервере сборки.

...