Visual Studio 2019 中的自动递增 FileVersion (build nr)

Posted

技术标签:

【中文标题】Visual Studio 2019 中的自动递增 FileVersion (build nr)【英文标题】:Auto increment FileVersion (build nr) in Visual Studio 2019 【发布时间】:2020-01-11 08:12:28 【问题描述】:

经过大量搜索,我找到了一个用于跟踪和增加项目 build nr 的工具。用于 c/c++ 项目。所有其他的要么已经过时,要么用于 C#。

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

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

没有源代码或 .pdb 可以修改/重新制作/分析。

还有比这更好的解决方案吗?

请指教,不胜感激。

【问题讨论】:

这可能是因为资源的语言。无论哪种方式,您都可以通过电子邮件将二进制文件或增量错误的测试项目发送给我。 @RomanR。语言是英国英语,我不能通过电子邮件发送任何二进制文件,因为这些是商业产品...... @RomanR。将语言更改为英语美国相同的结果.. 我发现唯一为我工作的是Verpatch。在构建后事件中,我运行简单的脚本,然后使用来自version.h 文件的数据运行 verpatch,然后在此文件中增加数字。 @Jovibor 谢谢,你能分享你的剧本吗? 【参考方案1】:

还有比这更好的解决方案吗?

更好,我不知道,不同的是。 实际不需要 3rd 方工具。我们使用一个简单的脚本来执行此操作,并且从我记事起它就一直在运行(我认为是关于 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

注意: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

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

powershell.exe -ExecutionPolicy Bypass -NoProfile -NonInteractive -File update_version.ps1 "./version.h"

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

(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

一些优点是:

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";

版本控制是集中的 处理主要/次要/补丁版本的其他脚本也很简单 脚本比较简单,维护也很简单

【讨论】:

感谢您,但由于某种原因,我收到“version.h(8): fatal error RC1004: unexpected end of file”。 version.h末尾添加新行。

以上是关于Visual Studio 2019 中的自动递增 FileVersion (build nr)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Microsoft Visual Studio 2017 或 2019 中启用或使用自动矢量化以及自动并行化?

如何在 sql server 内置的 Visual Studio 中自动增加主键?

使用 Visual Studio 2008 和 SVN 在 C++ 中进行自动版本控制

visual studio 2019从mysql数据库表通过命令自动生成实体类模型

Visual Studio 2019 VS的.pdb文件是什么?(用于调试)

Visual Studio 2019 VS的.pdb文件是什么?(用于调试)