Подтвердить что ты не робот

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

Я хочу использовать событие 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) не существует... Любые идеи?

4b9b3361

Ответ 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 для копии, и вы должны быть в порядке.