You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:02:08