Этот ответ является незначительной модификацией ответа Брента Ариаса. Его PostBuildMacro работал довольно хорошо для меня до обновления версии Nuget.exe.
В последних выпусках Nuget обрезает несущественные части номера версии пакета, чтобы получить семантическую версию, например "1.2.3". Например, версия сборки "1.2.3.0" отформатирована Nuget.exe "1.2.3". И «1.2.3.1» имеет формат «1.2.3.1», как и ожидалось.
Поскольку мне нужно определить точное имя файла пакета, сгенерированное Nuget.exe, я теперь использую этот адаптированный макрос (протестирован в VS2015):
<Target Name="PostBuildMacros">
<GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
<Output TaskParameter="Assemblies" ItemName="Targets" />
</GetAssemblyIdentity>
<ItemGroup>
<VersionNumber Include="$([System.Text.RegularExpressions.Regex]::Replace("%(Targets.Version)", "^(.+?)(\.0+)$", "$1"))" />
</ItemGroup>
</Target>
<PropertyGroup>
<PostBuildEventDependsOn>
$(PostBuildEventDependsOn);
PostBuildMacros;
</PostBuildEventDependsOn>
<PostBuildEvent>echo HELLO, THE ASSEMBLY VERSION IS: @(VersionNumber)</PostBuildEvent>
</PropertyGroup>
ОБНОВЛЕНИЕ 2017-05-24: Я исправил регулярное выражение следующим образом: «1.2.0.0» будет переводиться в «1.2.0», а не в «1.2», как ранее закодировано.
И чтобы ответить на комментарий Эрика Апра, вы можете адаптировать регулярное выражение, чтобы сохранить только некоторую часть номера версии. В качестве примера, чтобы сохранить «Major.Minor», заменить:
<VersionNumber Include="$([System.Text.RegularExpressions.Regex]::Replace("%(Targets.Version)", "^(.+?)(\.0+)$", "$1"))" />
К
<VersionNumber Include="$([System.Text.RegularExpressions.Regex]::Replace("%(Targets.Version)", "^([^\.]+)\.([^\.]+)(.*)$", "$1.$2"))" />