Visual Studio 2019 中自动递增文件版本(版本号)

Nor*_*ros 1 c++ windows visual-studio

经过大量搜索后,我找到了一个用于跟踪和增加项目构建编号的工具。对于 C/C++ 项目。所有其他的要么已经过时,要么适用于 C#。

我正在使用此博客中的 IncrementBuild-*.exe:http://alax.info/blog/1713

它按预期工作,但我相信我做错了什么,因为在运行此工具后构建后,它出于某种原因添加了另一个 VERSIONINFO 资源。该项目最终有 2 种资源,原始资源和修补后的资源。

没有源代码或 .pdb 来修改/重制/分析它。

有没有人有比这更好的解决方案?

请指教,不胜感激。

use*_*087 8

有没有人有比这更好的解决方案?

更好,我不知道,不同的是。
实际上并不需要第三方工具。我们使用一个简单的脚本来执行此操作,并且从我记事起它就一直在运行(我认为是关于 Visual Studio 2010,从那时起进行了一些更改)。但是,您需要满足一些先决条件(但这可以派上用场)。以下脚本应在 Visual Studio 2019/2017 和 PowerShell 3+ 中运行。

version.h我们有一个如下所示的文件:

#pragma once
#define VERSION_MAJOR 1
#define VERSION_MINOR 0
#define VERSION_PATCH 0
#define VERSION_BUILD 0

#define stringify(a) stringify_(a)
#define stringify_(a) #a
Run Code Online (Sandbox Code Playgroud)

注意:version.h 需要在末尾换行以避免fatal error RC1004: unexpected end of file found.

资源文件可以包含头文件,因此包含version.h在资源文件中并将其更改为相应地使用定义:

#include "version.h"
// ... other stuff

VS_VERSION_INFO VERSIONINFO
 FILEVERSION VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH, VERSION_BUILD
 PRODUCTVERSION VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH, VERSION_BUILD

// ... other stuff
            VALUE "FileVersion", stringify(VERSION_MAJOR) "." stringify(VERSION_MINOR) "." stringify(VERSION_PATCH) "." stringify(VERSION_BUILD)
            VALUE "ProductVersion", stringify(VERSION_MAJOR) "." stringify(VERSION_MINOR) "." stringify(VERSION_PATCH) "." stringify(VERSION_BUILD)
// ... other stuff
Run Code Online (Sandbox Code Playgroud)

现在,在项目属性预构建脚本中,我们正在运行 PowerShell 脚本。命令:

powershell.exe -ExecutionPolicy Bypass -NoProfile -NonInteractive -File update_version.ps1 "./version.h"
Run Code Online (Sandbox Code Playgroud)

该脚本是一个带有增量的查找和替换文本:

(Get-Content -path $args[0] -Raw) |
    ForEach-Object {
        $defstr="#define VERSION_BUILD ";
        $regex="$defstr(?<BuildVersion>\d*)";
        if($_ -match $regex) {
            $_ = $_ -replace $regex,"$($defstr)$(([int]$matches["BuildVersion"])+1)" 
        }
        $_
    } |
    Out-File $args[0] -encoding ascii -nonewline
Run Code Online (Sandbox Code Playgroud)

一些优点是:

  • version.h是纯 C 语言,可以由任何 C/C++ 兼容编译器、MSVC 资源编译器甚至 Doxygen 等工具进行解析。
  • 您可以在 C++ 文件中使用它:
#include "version.h"
int main() {
    std::cout << "Hello World Version " stringify(VERSION_MAJOR) "." stringify(VERSION_MINOR) "." stringify(VERSION_PATCH) "." stringify(VERSION_BUILD) " !\n";
}
Run Code Online (Sandbox Code Playgroud)
  • 版本控制是集中的
  • 其他处理主要/次要/补丁版本的脚本也很简单
  • 脚本相当简单,维护也简单