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),既保持了版本號的可追溯性,又避免了手動維護版本號的繁瑣操作。