Как получить номер версии в событии после сборки

Я хочу использовать событие 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 ответа

Решение

Этот сценарий пост сборки работает для меня. Он упаковывает и публикует мои версии 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"

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

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 Команда события будет выглядеть так:

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!!

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

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

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

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

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

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

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

nuget push

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

ВЫПУСК В РЕЛИЗЕ:

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

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

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

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

Попробуй это:

Отредактируйте ваш файл.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>

Я попробовал то, что предложил 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.

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

Другие вопросы по тегам