Получение номера версии nupkg в msbuild
Я изменил файл csproj в VS2017, чтобы создать пакет Nuget, когда мой проект.NET 4.5 готовится к выпуску. Следующим шагом автоматизации является добавление этого пакета в мою личную ленту на сетевом ресурсе. Вот команды, которые я использую:
<Exec Command="nuget.exe pack -Properties "Configuration=Release" -Symbols $(ProjectName).csproj" />
<Exec Command="nuget.exe add $(ProjectName).$(ProductVersion).nupkg -source \\MYSERVER\Nuget packages" />
Строка 1 работает и создает файл nupkg вида productname.nn.nn.nn.nn.
Однако строка 2 не возвращает значение для токена ProductVersion (что было предположением с моей стороны).
Я изо всех сил пытался найти ссылку на токены MSBUILD (что само по себе было бы полезно знать), но что мне действительно нужно знать, так это правильный токен / переменная / свойство MSBUILD для версии - и это то же значение, что и сгенерированный пакет Nuget.
2 ответа
Я исследовал $(PackageVersion), предложенный Мартином Уллрихом, но он не будет работать со старыми проектами даже с установленным Nuget 4.10. Кроме того, я не смог заставить пример Troopers работать так, как мне хотелось, и я получил вариант одного из постов здесь. Я адаптировал его, чтобы дать мне версию сборки, а не версию файла.
<UsingTask TaskName="GetVersionParts" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<AssemblyPath ParameterType="System.String" Required="true" />
<MajorVersion ParameterType="System.Int32" Output="true" />
<MinorVersion ParameterType="System.Int32" Output="true" />
<BuildVersion ParameterType="System.Int32" Output="true" />
</ParameterGroup>
<Task>
<Using Namespace="System.Reflection" />
<Code Type="Fragment" Language="cs">
<![CDATA[
Version v = AssemblyName.GetAssemblyName(this.AssemblyPath).Version;
this.MajorVersion = v.Major;
this.MinorVersion = v.Minor;
this.BuildVersion = v.Build;
]]>
</Code>
</Task>
</UsingTask>
<Target Name="AfterBuild" Condition=" '$(Configuration)' == 'Release'">
<Message Text="**** After-build process starting ****" />
<Exec Command="nuget.exe pack -Properties "Configuration=Release" -Symbols $(ProjectName).csproj" />
<GetVersionParts AssemblyPath="$(OutputPath)$(AssemblyName).dll">
<Output TaskParameter="MajorVersion" PropertyName="MajorVersionNumber" />
<Output TaskParameter="MinorVersion" PropertyName="MinorVersionNumber" />
<Output TaskParameter="BuildVersion" PropertyName="BuildVersionNumber" />
</GetVersionParts>
<Exec Command="nuget.exe add $(MSBuildProjectName).$(MajorVersionNumber).$(MinorVersionNumber).$(BuildVersionNumber).nupkg -source "\\My feed server\Shared location"" />
<Exec Command="move *.symbols.nupkg "\\My feed server\Shared location\Symbols"" />
<Message Text="**** After-build process completed ****" />
</Target>
Хотя это работает, я не могу не чувствовать, что это должно быть проще.
дальнейшее чтение
https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-inline-tasks https://docs.microsoft.com/en-us/visualstudio/msbuild/common-msbuild-project-properties https://docs.microsoft.com/en-us/nuget/tools/nuget-exe-cli-reference
Вы можете получить версию сборки с этим макросом. Я называю это до события postbuild, например
<!--Macro to get the version -->
<Target Name="PostBuildMacros">
<GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
<Output TaskParameter="Assemblies" ItemName="CurrentAssembly" />
</GetAssemblyIdentity>
<ItemGroup>
<VersionNumber Include="%(CurrentAssembly.Version)" />
</ItemGroup>
</Target>
<!-- override PostBuildEvent to call PostBuildMacros -->
<PropertyGroup>
<PostBuildEventDependsOn>
$(PostBuildEventDependsOn);
PostBuildMacros;
</PostBuildEventDependsOn>
<PostBuildEvent>
...
</PostBuildEvent>
</PropertyGroup>