Как получить номер версии в событии после сборки - PullRequest
13 голосов
/ 20 сентября 2011

Я хочу использовать событие post-build для автоматического создания пакета nuget, а затем скопировать его в общую папку в нашей сети, что-то вроде этого (номер версии 1.0.0.0. Указан в файле MyLib.nuspec):

nuget.exe pack "$(SolutionDir)MyLib.nuspec"
xcopy /Y "$(TargetDir)MyLib.1.0.0.0.nupkg" \\folder\subfolder\NuGetPackages

Это работает, но теперь я хотел бы обновить этот скрипт, чтобы он также включал версию сборки, но я не могу получить версию сборки внутри события после сборки. Мне нужно что-то вроде этого:

nuget.exe pack -Version $(AssemblyVersion) "$(SolutionDir)MyLib.nuspec"
xcopy /Y "$(TargetDir)MyLib." + $(AssemblyVersion) + ".nupkg" \\folder\subfolder\NuGetPackages

Но переменной $ (AssemblyVersion) не существует ... Есть идеи?

Ответы [ 4 ]

5 голосов
/ 31 мая 2013

Этот скрипт пост-поста работает для меня.Он упаковывает и публикует мои версии dev для каждой сборки.Довольно просто.

del $(ProjectDir)bin\Debug\*.nupkg
"$(ProjectDir)NuGet.exe" pack "$(ProjectDir)MyProject.csproj"
forfiles /P $(ProjectDir)bin\Debug\ /m *.nupkg /c "cmd /c "$(ProjectDir)NuGet.exe" push @FILE -Source \\SHARE\NuGet"
3 голосов
/ 23 февраля 2012

Попробуйте следующее:

1) Переименуйте ваш .nuspec, чтобы он соответствовал имени .csproj:

Если ваш проект: MyLib.csproj

Переименуйте MyLib.nuspec в MyLib.csproj.nuspec

2) Измените ваш файл .nuspec следующим образом:

<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
  <metadata>
    <version>$version$</version>
    <authors>$author$</authors>
    <id>$id$</id>
    <title>$id$</title>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>$description$</description>
    <summary>$description$</summary>
  </metadata>
</package>

Здесь работа выполняется токеном Nuget "$ version $" (и другими)

Взгляните на эту статью Nuget для получения дополнительных токенов и информации.

3) Используйте следующее событие после сборки в каждом проекте, в который вы помещаете файл .csproj.nuspec (пожалуйста, удалите клавиши Enter):

mkdir "$(SolutionDir)GeneratedPackages"

"$(SolutionDir).nuget\nuget.exe" pack "$(ProjectPath)" 
-OutputDirectory "$(SolutionDir)GeneratedPackages" 
-basepath "$(SolutionDir)$(ProjectName)\$(OutDir)"

Если у нас есть решение C: \ MySolution \ MyLib.sln и проект в c: \ MySolution \ MyLib \ MyLib.csproj, наш файл .nuspec должен быть c: \ MySolution \ MyLib \ MyLib.csproj.nuspec и команда Post Build Event будет выглядеть так:

mkdir "C:\MySolution\GeneratedPackages"

"C:\MySolution\.nuget\nuget.exe" pack "C:\MySolution\MyLib\MyLib.csproj" 
-OutputDirectory "C:\MySolution\GeneratedPackages" 
-basepath "C:\MySolution\MyLib\bin\debug\"

Исправить путь к nuget.exe. В моем случае я использую Nuget «автоматически восстановить отсутствующие зависимости при сборке», и у меня есть локальная копия в решении, в папке .nuget.

Обратите внимание, что мы не вызываем nuget с файлом .nuspec, мы вызывая его напрямую через .csproj !!

Эта стратегия также будет включать все зависимости Проекта, объявленные в packages.xml, который Nuget создает при установке пакетов. (автоматически, каждый раз, когда вы строите)

И все готово! Теперь измените сборку и версию файла в

Проект> Свойства> Информация о сборке

ВАЖНО: Если вы установите токены $ author $ и / или $ description $, заполните также поля Company Company и Description Ассамблеи. Если у вас возникли проблемы, удалите токены $ author $ и / или $ description $ и попробуйте снова скомпилировать.

и соберите свой проект, вы увидите в папке / GeneratedPackages папку MyLib.X.X.X.X.nupack с версией, которую вы указали в свойствах проекта. Если вы установите зависимости, вы увидите, что они были автоматически включены как зависимости пакета.

Мы используем эту стратегию с CI-сервером Jenkins для автоматического построения решения и копирования пакетов из GeneratedPackages в наш пользовательский NugetServer.

Вы также можете завершить мероприятие Post Build с

nuget push

Чтобы отправить сгенерированный пакет на сервер Nuget

ВЫПУСК В ВЫПУСКЕ:

Как уже упоминалось в комментариях, существует проблема, которая не позволяет Nuget.exe генерировать пакеты в режиме RELEASE.

Сделайте это, чтобы исправить это:

Для каждого проекта с этим скриптом:

  1. Свойства проекта> Build
  2. В раскрывающемся списке «Конфигурация» выберите «Все конфигурации»
  3. В разделе «Ouput» измените поле «Выходной путь:», например, я сейчас использую «bin \» (без кавычек)
3 голосов
/ 24 октября 2011

Попробуйте:

Отредактируйте ваш файл .csproj и добавьте этот блок:

<Target Name="AfterBuild">
    <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
        <Output TaskParameter="Assemblies" ItemName="CurrentAssembly" />
    </GetAssemblyIdentity>
    <Exec Command="xcopy /Y $(TargetDir)MyLib.%(CurrentAssembly.Version).nupkg \\folder\subfolder\NuGetPackages"></Exec>
</Target>
1 голос
/ 30 марта 2012

Я попробовал то, что предложил giammin, и с помощью нескольких настроек это помогло мне:

<Target Name="AfterBuild">
    <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
       <Output TaskParameter="Assemblies" ItemName="CurrentAssembly" />
    </GetAssemblyIdentity>
    <Exec Command="copy /Y $(TargetPath) $(ProjectDir)Versions\$(TargetName)_%(CurrentAssembly.Version).dll" Condition="'$(ConfigurationName)' == 'Stage'" />
</Target>

Я добавил атрибут «Условие», чтобы я мог указать, когда он будет построен в определенном месте (в моем случае создание резервной копии для отката). Кроме того, «xcopy» давал мне ошибки ... но нормального "копирования" не было.

Затем в моем событии после сборки у меня есть что-то вроде этого:

copy $(TargetDir)*.dll \\dev-server\folder

IF NOT "$(ConfigurationName)" == "Stage" EXIT

mkdir "$(ProjectDir)Versions"
copy /Y "$(TargetPath)" \\stage-server\folder

Я надеюсь, что все каким-то образом помогает.

Обратите внимание, что событие после сборки выполняется ДО элемента "AfterBuild" XML-файла csproj.

Так что вы можете просто использовать в событии после сборки: Пакет nuget.exe "$ (SolutionDir) MyLib.nuspec" и добавьте элемент afterbuild для копии, и все будет в порядке.

...