【C++动态版本号生成方案:实现类似C# 1.0.* 的自动构建号】
C++动态版本号生成方案:实现类似C# 1.0.* 的自动构建号
在C#中,1.0.*
版本号格式会在编译时自动生成构建号和修订号。本文将介绍如何在C++项目中实现类似功能,通过MSBuild自动化生成基于编译时间的版本号。
实现原理
- 版本号构成:
主版本.次版本.构建号.修订号
- 自动生成规则:
- 构建号:从2000-01-01到编译日期的天数
- 修订号:当天经过的秒数/2(与C#算法一致)
实现步骤
1. 创建版本资源文件
项目目录->资源文件->右键->添加->资源->Version
选中资源文件->右键->查看代码,
在打开的.rc
文件中添加版本值指向宏信息定义:MY_FILE_VERSION
和 MY_PRODUCT_VERSION
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
#ifndef MY_FILE_VERSION
#define MY_FILE_VERSION 861,3005,3314,98
#define MY_PRODUCT_VERSION 861,3005,3314,98
#endifVS_VERSION_INFO VERSIONINFO
FILEVERSION MY_FILE_VERSION
PRODUCTVERSION MY_PRODUCT_VERSION
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x2L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "080404b0"
BEGIN
VALUE "CompanyName", "BetaTech"
VALUE "FileDescription", "Beta.Core.AbstractBase"
VALUE "FileVersion", "1.0.0.0"
VALUE "InternalName", "Beta.Core"
VALUE "LegalCopyright", "Copyright (C) 2018"
VALUE "OriginalFilename", "Beta.Core"
VALUE "ProductName", "Beta.Core.AbstractBase"
VALUE "ProductVersion", "1.0.0.0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x804, 1200
END
END
#endif // resources
/////////////////////////////////////////////////////////////////////////////
2. 编写MSBulid的Target
选中项目->右键卸载项目->显示已卸载->双击项目->打开xxx.vcxproj文件
在文件开头,Project节点内添加一个Target节点。内容如下
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><!-- 构建前:创建资源宏定义修改版本号 --><Target Name="UpdateVersionBeforeBuild" BeforeTargets="BeforeClCompile"><PropertyGroup><BaseDate>$([System.DateTime]::new(2000, 1, 1))</BaseDate><Now>$([System.DateTime]::Now)</Now><Days>$([System.DateTime]::op_Subtraction($(Now), $(BaseDate)).Days)</Days><TimeOfDay>$([System.DateTime]::Now.TimeOfDay)</TimeOfDay><TotalSeconds>$([System.TimeSpan]::Parse($(TimeOfDay)).TotalSeconds)</TotalSeconds><Seconds>$([System.Math]::Floor($([MSBuild]::Divide($(TotalSeconds), 2))))</Seconds><NewVersion>1,0,$(Days),$(Seconds)</NewVersion><NewResPreprocessorDefinitions></NewResPreprocessorDefinitions></PropertyGroup><ItemGroup><ResourceCompile><PreprocessorDefinitions>MY_FILE_VERSION=$(NewVersion);MY_PRODUCT_VERSION=$(NewVersion);%(PreprocessorDefinitions)</PreprocessorDefinitions></ResourceCompile></ItemGroup><!-- 打印版本号,输出显示到控制台 --><Message Text="Updating version to: %(ResourceCompile.PreprocessorDefinitions)" Importance="high" /></Target><!-- 此处省略文件原本的内容 --></Project>
3. 保存,重新加载项目,执行重新生成。
保存文件 -> 选中项目 -> 右键 -> 重新加载项目 -> 右键 ->重新生成。
4.结束
通过这种方式,每次构建都会生成唯一的版本号(如1.0.7890.32456),既保持了版本号的可追溯性,又避免了手动维护版本号的繁琐操作。