Автоматизация создания пакета NuGet как часть процесса сборки

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

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

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

(Я должен уточнить, что существующий "автоматизированный" процесс - это простой run-file runner, который создает решение с использованием командной строки.)

UPDATE

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

Лучшим примером, который я могу использовать, является сборка с версией .NET 4 и Silverlight 5. Они распространяются в одном пакете. Я не могу использовать событие post-build для создания пакета, потому что пакет зависит от двух проектов.

Ответ 1

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

Пример 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

Ответ 2

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

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

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

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

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

Итак, он идет:

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

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

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 на верхнем уровне моего дерева разработки.

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 7

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

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

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

Вот оно.

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

Ответ 8

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

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

  • Изменения клона/тяги.
  • Построить решение.
  • Построить пакет (ы).
  • Загрузка пакетов (пакетов) на сервер пакетов.

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

Ответ 9

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

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

https://nuget4msbuild.codeplex.com/