Как получить номер версии в событии после сборки
Я хочу использовать событие 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.
Сделайте это, чтобы исправить это:
Для каждого проекта с этим скриптом:
- Свойства проекта> Построить
- В раскрывающемся списке "Конфигурация" выберите "Все конфигурации".
- В разделе "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 для копии, и все будет в порядке.