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

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

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

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

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

ОБНОВЛЕНИЕ

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

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


person SonOfPirate    schedule 07.02.2012    source источник
comment
Вы пробовали: docs.nuget.org/docs/workflows/   -  person KMoraz    schedule 09.02.2012
comment
Это не имеет ничего общего с моим вопросом. Эта ссылка описывает рабочий процесс ИСПОЛЬЗОВАНИЯ пакетов nuget. Мой вопрос касается СОЗДАНИЯ пакетов nuget.   -  person SonOfPirate    schedule 10.02.2012
comment
Также было бы неплохо автоматически увеличивать версию в сборках выпуска.   -  person Ufuk Hacıoğulları    schedule 06.03.2012


Ответы (9)


Одна вещь, которая может сработать, - это создать собственный файл MSBuild .proj. Вы можете определить пару целей в настраиваемом скрипте, первая из которых выполнит компиляцию вашего решения. Вторая цель, выполняемая после компиляции, будет использовать задачу EXEC MSBuild для вызова служебной программы командной строки nuget.exe. Затем вы обновляете свой пакетный файл-исполнитель, чтобы выполнить исполняемый файл msbuild, предоставляя ваш пользовательский файл проекта в качестве аргумента. Возможно, вы уже используете MSBuild в своем пакетном сценарии, что в этом случае будет просто вопросом обмена аргументами. Вы можете включить свой собственный файл проекта в элементы решения вашего решения. Если вы это сделаете, вы можете легко добавить ссылку на внешний инструмент в 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
person Josh Rack    schedule 02.03.2012
comment
Не могли бы вы дать мне несколько ссылок, чтобы увидеть, как это можно сделать? - person SonOfPirate; 07.03.2012
comment
Примечание: приведенный выше образец не был полностью протестирован, но это концептуально, как вы можете это сделать. Ссылка MSBuild на MSDN должна помочь вам более полно раскрыть его. - person Josh Rack; 08.03.2012
comment
Я рекомендую использовать NuGetter. Пользоваться и настраивать намного проще :) - person H A; 06.11.2012

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

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

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

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

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

Такие дела:

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

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

Скрипт сборки:

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

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

person Schwarzie2478    schedule 07.03.2012
comment
Я считаю, что вы можете скопировать вывод из других проектов также на этапе пост-сборки, если вы знаете, что они уже созданы ... - person Schwarzie2478; 07.03.2012
comment
Ваш комментарий является ключевым - если вы знаете, что они уже построены. - person SonOfPirate; 08.03.2012
comment
Я предполагаю, что есть определенный порядок запуска сборок. В противном случае вы можете настроить пустые проекты, которые всегда будут собираться в качестве последнего шага. - person Schwarzie2478; 08.03.2012

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

person Alex    schedule 17.07.2012
comment
Однако с помощью этого шаблона невозможно создать один пакет nuget для каждого проекта. Кто-нибудь делал это на уровне TFS 2010? - person Alex; 17.07.2012
comment
NuGetter также должен работать с TFS 2012, но вам нужно будет обновить сборки до TFS 2012. - person H A; 06.11.2012
comment
NuGetter также попутно рекомендовал Microsoft MVP Марсель де Фрис в несвязанном видео. Интересно узнать о его достоинствах по сравнению с NuBuild. - person RJB; 25.05.2016

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

person Brent M. Spell    schedule 14.11.2012
comment
Интересно узнать о его достоинствах по сравнению с NuGetter - person RJB; 25.05.2016

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

person Matthew M. Osborn    schedule 05.03.2012
comment
Версия 1.6 добавляет параметр уровня решения, который позволяет вам добавлять цель сборки в каждый проект, чтобы вам не приходилось фиксировать пакеты в системе управления версиями. Хотя целевой файл сборки используется всеми проектами, он по-прежнему выполняется как часть процесса сборки для каждого отдельного проекта. Это не помогает в моей ситуации, когда мне нужно создать один пакет, содержащий выходные данные сборки из нескольких проектов. - person SonOfPirate; 07.03.2012

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

person habakuk    schedule 21.03.2014
comment
Я думал, что этот плагин предназначен для сборок IDE в Visual Studio, а не для MSBuilds в TFS. Я ошибся? - person Prisoner ZERO; 14.01.2015
comment
@PrisonerZERO - он работает для сборок IDE, а для MSBuilds я еще не пробовал. - person habakuk; 15.01.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.

person Beachwalker    schedule 31.01.2015

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

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

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

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

person Neil Barnwell    schedule 01.03.2012
comment
Вы, безусловно, можете создать несколько библиотек для работы, которая создает пакет nuget как часть процесса сборки и даже отправляет его во внутренний канал nuget нашей компании как часть нашего процесса сборки выпуска с использованием скриптов msbuild и инструмента командной строки nuget, хотя я Я рад видеть, что есть библиотека, которая помогает с этим, теперь мне придется поэкспериментировать с ней на следующей стадии экспериментальной сборки - person Chris McGrath; 16.04.2013

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

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

https://nuget4msbuild.codeplex.com/

person CountZero    schedule 12.01.2017