如何在SDK风格项目中用Git修订号自动设置VersionSuffix?
如何在SDK风格项目中自动将Git修订号纳入VersionSuffix
我希望我的SDK风格项目的程序集能自动将Git修订号包含到<VersionSuffix>中。目前的配置已经能正确获取Git修订号,但<VersionSuffix>属性没有按预期更新:
原项目配置:
<Project> <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" /> <PropertyGroup> <TargetFramework>net7.0</TargetFramework> <Nullable>enable</Nullable> <VersionSuffix>UNSET</VersionSuffix> </PropertyGroup> <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" /> <Target Name="BeforeBuild"> <Exec Command="git rev-parse --verify --short HEAD" ConsoleToMSBuild="true"> <Output TaskParameter="ConsoleOutput" PropertyName="GitRevision"/> </Exec> <Message Text="HEAD is at $(GitRevision)" Importance="high"/> <PropertyGroup> <VersionSuffix>$(GitRevision)</VersionSuffix> </PropertyGroup> </Target> </Project>
执行构建命令:
dotnet publish XYZ -c Release
构建输出:
MSBuild version 17.6.1+8ffc3fe3d for .NET Determining projects to restore... All projects are up-to-date for restore. 9f3d8fb HEAD is at 9f3d8fb XYZ -> ...\bin\Release\net7.0\XYZ.dll XYZ -> ...\bin\Release\net7.0\publish\
从输出能看到$(GitRevision)已正确获取到值,但程序集属性里的VersionSuffix仍然是UNSET。
问题原因
BeforeBuild目标的执行时机太晚——此时程序集版本相关的元数据已经被SDK处理完成,后续修改VersionSuffix不会同步到程序集属性中。
解决方案
方案一:提前设置VersionSuffix(适配原有需求)
将目标的执行时机调整为CoreCompile之前,确保版本属性在编译程序集前就生效,同时去除Git命令输出中的换行符(避免版本号带空白):
<Project> <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" /> <PropertyGroup> <TargetFramework>net7.0</TargetFramework> <Nullable>enable</Nullable> <VersionSuffix>UNSET</VersionSuffix> </PropertyGroup> <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" /> <Target Name="SetGitVersionSuffix" BeforeTargets="CoreCompile"> <Exec Command="git rev-parse --verify --short HEAD" ConsoleToMSBuild="true"> <Output TaskParameter="ConsoleOutput" PropertyName="GitRevision"/> </Exec> <!-- 移除输出中的换行符,避免版本号包含空白 --> <PropertyGroup> <GitRevision>$([System.Text.RegularExpressions.Regex]::Replace($(GitRevision), "\r?\n", ""))</GitRevision> <VersionSuffix>$(GitRevision)</VersionSuffix> </PropertyGroup> <Message Text="Set VersionSuffix to $(VersionSuffix)" Importance="high"/> </Target> </Project>
方案二:直接设置完整Version属性(推荐)
如果不需要单独维护VersionSuffix,可以直接构造包含Git修订号的完整版本字符串,结合VersionPrefix使用:
<Project> <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" /> <PropertyGroup> <TargetFramework>net7.0</TargetFramework> <Nullable>enable</Nullable> <VersionPrefix>1.0.0</VersionPrefix> </PropertyGroup> <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" /> <Target Name="SetFullVersion" BeforeTargets="CoreCompile"> <Exec Command="git rev-parse --verify --short HEAD" ConsoleToMSBuild="true"> <Output TaskParameter="ConsoleOutput" PropertyName="GitRevision"/> </Exec> <PropertyGroup> <GitRevision>$([System.Text.RegularExpressions.Regex]::Replace($(GitRevision), "\r?\n", ""))</GitRevision> <Version>$(VersionPrefix)-$(GitRevision)</Version> </PropertyGroup> <Message Text="Set Version to $(Version)" Importance="high"/> </Target> </Project>
验证方法
构建完成后,右键程序集文件查看属性中的“产品版本”字段,或者执行dotnet build -v detailed,在输出中搜索Version或VersionSuffix确认值已更新。
内容的提问来源于stack exchange,提问作者Matt Thomas
相关产品推荐
相关产品推荐

