如何仅用MS Build语法在.NET Core csproj中递增NuGet PackageVersion?
在.NET Core项目中通过csproj Target自动递增NuGet PackageVersion
不用再依赖PowerShell脚本,直接在.csproj文件中通过MSBuild Target/Task就能实现PackageVersion的自动递增,以下是具体实现方案:
1. 基础版本配置
先在项目文件中定义基础版本属性,后续Target会基于此进行递增:
<PropertyGroup> <!-- 定义基础版本格式:主版本.次版本.修订号 --> <VersionPrefix>1.0.0</VersionPrefix> <!-- 初始PackageVersion,会被后续Target覆盖 --> <PackageVersion>$(VersionPrefix)</PackageVersion> </PropertyGroup>
2. 添加自动递增版本的Target
在.csproj中插入自定义Target,确保在构建前执行版本递增逻辑:
<Target Name="IncrementPackageVersion" BeforeTargets="BeforeBuild"> <!-- 解析当前VersionPrefix,拆分版本号各部分 --> <PropertyGroup> <ParsedVersion>$([System.Version]::Parse($(VersionPrefix)))</ParsedVersion> <!-- 递增修订号 --> <NewRevision>$([System.Math]::Add($(ParsedVersion.Revision), 1))</NewRevision> <!-- 拼接新的版本前缀 --> <NewVersionPrefix>$(ParsedVersion.Major).$(ParsedVersion.Minor).$(NewRevision)</NewVersionPrefix> </PropertyGroup> <!-- 更新项目的版本属性 --> <PropertyGroup> <VersionPrefix>$(NewVersionPrefix)</VersionPrefix> <PackageVersion>$(NewVersionPrefix)</PackageVersion> </PropertyGroup> <!-- 可选:将更新后的版本号写入项目文件,下次构建沿用(若不需要永久保存可删除此段) --> <WriteLinesToFile File="$(MSBuildProjectFile)" Lines="<PropertyGroup>
 <VersionPrefix>$(NewVersionPrefix)</VersionPrefix>
</PropertyGroup>" Overwrite="false" Encoding="UTF-8" InsertAt="Beginning" /> </Target>
关键逻辑说明
BeforeTargets="BeforeBuild":保证版本递增操作在项目构建前完成- 利用MSBuild内置的
System.Version和System.Math类解析、递增版本号,无需额外依赖 WriteLinesToFile段用于永久保存递增后的版本,若只需要本次构建生效,可直接删除该部分
3. 自定义递增规则(进阶)
如果需要按日期生成版本,或者递增主/次版本,可修改Target逻辑,示例如下:
按日期生成版本号
<Target Name="IncrementPackageVersionByDate" BeforeTargets="BeforeBuild"> <PropertyGroup> <CurrentYear>$([System.DateTime]::Now.Year)</CurrentYear> <CurrentMonth>$([System.DateTime]::Now.Month.ToString("D2"))</CurrentMonth> <CurrentDay>$([System.DateTime]::Now.Day.ToString("D2"))</CurrentDay> <BuildSerial>$([System.DateTime]::Now.Hour.ToString("D2"))$([System.DateTime]::Now.Minute.ToString("D2"))</BuildSerial> <PackageVersion>$(CurrentYear).$(CurrentMonth).$(CurrentDay).$(BuildSerial)</PackageVersion> </PropertyGroup> </Target>
仅在Release构建时递增
<Target Name="IncrementPackageVersion" BeforeTargets="BeforeBuild" Condition="'$(Configuration)' == 'Release'"> <!-- 内容同基础版本递增逻辑 --> </Target>
注意事项
- 要求项目基于.NET Core 3.0及以上版本,确保MSBuild支持这些内联函数
- 若使用
WriteLinesToFile,项目文件会被修改,建议将其纳入版本控制 - 若团队协作开发,需确认所有成员的构建环境均支持该MSBuild语法
内容的提问来源于stack exchange,提问作者Robin Johnson
相关产品推荐
相关产品推荐

