Как получить номер версии в событии после сборки
Я хочу использовать событие 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
Это работает, но теперь я хотел бы обновить этот script, чтобы он включал и версию сборки, но я не могу получить версию сборки внутри события после сборки. Мне нужно что-то вроде этого:
nuget.exe pack -Version $(AssemblyVersion) "$(SolutionDir)MyLib.nuspec"
xcopy /Y "$(TargetDir)MyLib." + $(AssemblyVersion) + ".nupkg" \\folder\subfolder\NuGetPackages
Но переменная $(AssemblyVersion) не существует... Любые идеи?
Ответы
Ответ 1
Эта пост-сборка script работает для меня. Он упаковывает и публикует мои версии 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"
Ответ 2
Попробуйте следующее:
Отредактируйте файл .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>
Ответ 3
Попробуйте следующее:
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>
Здесь задание выполняется токеном "$ version $" (и другими)
Посмотрите на статью Nuget для получения большего количества токенов и информации.
3) Используйте следующее событие Post Build в каждом проекте, который вы поместите файл .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 и Команда Event Build Post будет выглядеть так:
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 при установке пакетов. (автоматически, каждый раз, когда вы строите)
И все готово! Теперь измените версию сборки и файла в
Проект > Свойствa > Информация о сборке
ВАЖНО: Если вы устанавливаете $author $и/или $description $tokens, заполните также поля Assembly Company и Description. Если у вас возникли проблемы, удалите токены $author $и/или $description $и попробуйте снова скомпилировать.
и создайте свой проект, вы увидите в папке /GeneratedPackages папку MyLib.X.X.X.X.nupack с версией, установленной в свойствах проекта. Если вы установите зависимости, вы увидите, что он был автоматически включен в качестве зависимостей пакета.
Мы используем эту стратегию с сервером Jenkins CI для автоматического создания решения и копирования пакетов из GeneratedPackages в наш пользовательский NugetServer.
Вы также можете завершить событие Post Build с помощью
nuget push
Чтобы отправить сгенерированный пакет на сервер Nuget
ВЫПУСК В РЕЛИЗЕ:
Как упоминалось в комментариях, существует проблема, которая не позволяет Nuget.exe создавать пакеты в режиме RELEASE.
Сделайте это, чтобы исправить это:
Для каждого проекта с этим script:
- Свойства проектa > Строить
- В раскрывающемся списке "Конфигурация" выберите "Все конфигурации"
- В разделе "Ouput" измените поле "Выходной путь:", например, в настоящее время я использую "bin" (без cuotes)
Ответ 4
Я попробовал то, что предложил 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
Я надеюсь, что все это поможет.
Обратите внимание, что событие post-build выполняется перед элементом "AfterBuild" XML-кода csproj.
Итак, вы можете просто использовать в своем post post event: nuget.exe pack "$ (SolutionDir) MyLib.nuspec"
и добавьте элемент afterbuild для копии, и вы должны быть в порядке.