Qt应用程序版本在.pro中使用自定义目标自动递增

Qt应用程序版本在.pro中使用自定义目标自动递增,qt,versioning,Qt,Versioning,我想在每次构建时自动增加我的项目版本。我有一个简单的程序,可以用更新的版本重新生成头文件。我想在每次构建时调用此程序。它可以很简单地在单个项目中完成(添加一个构建步骤),但使用subdirs项目要复杂得多 我已经阅读了关于这个问题的几个主题,并且都建议在.pro文件中使用自定义目标。我的主要参考资料是 我已经做了几个测试,但在构建期间无法运行自定义命令。出于测试目的,我将此代码保存在.pro文件中 versiontarget.target = version.h versiontarget.co

我想在每次构建时自动增加我的项目版本。我有一个简单的程序,可以用更新的版本重新生成头文件。我想在每次构建时调用此程序。它可以很简单地在单个项目中完成(添加一个构建步骤),但使用subdirs项目要复杂得多

我已经阅读了关于这个问题的几个主题,并且都建议在.pro文件中使用自定义目标。我的主要参考资料是

我已经做了几个测试,但在构建期间无法运行自定义命令。出于测试目的,我将此代码保存在.pro文件中

versiontarget.target = version.h
versiontarget.command = LaunchTM
versiontarget.depends = FORCE
PRE_TARGETDEPS += version.h
QMAKE_EXTRA_TARGETS += versiontarget
这里我使用
LaunchTM
作为测试命令(我在Windows上;此命令启动任务管理器)。无论是在启动“重建”时,还是在编辑后生成时,都不会执行该命令。我还注意到,在生成的makefile中没有关于
versiontarget
LaunchTM
的引用

我错过什么了吗

当我能够启动test命令时,切换到正确的命令不是问题。

看起来像是“versiontarget.commands中的打字错误-示例代码中缺少粗体“s”。qmake似乎没有检查它,只是忽略了它,就像“commands”是空的一样威胁它

另一种可能的工作方式是(第一种是与项目中指定的第一个目标相关的预定义内容,因此您应该在main之前执行额外的目标,因为它依赖于它):

UPD:您知道如何仅在构建实际发生时运行自定义目标吗

AFAIK有几种解决方案:

  • 若你们的版本自动递增脚本将产生一些颠簸版本,例如,头文件,这将包括在你们的项目中使用-只是忽略它。代码更改将触发应用程序构建

  • 使用而不是QMAKE_EXTRA_目标,例如:

    QMAKE_POST_LINK+=LaunchTM

  • 仅当您的构建触发链接(应用程序更改)时,才应运行该程序

    注意:这样你应该记住,应用程序中的版本会比你存储在某处的版本少,因为它是在编译后触发的。然而,不管怎样,它都会给你带来版本差异

  • 如果您使用的是VCS(版本控制),那么可以配置提交/推送(如果使用了git)挂钩,并以这种方式增加版本。这种解决方案的好处是,您可以自动配置提交到存储库的版本更改,并且如果您从存储库获取代码并构建它,那么版本将被正确设置,因为它将与实际的代码更改(提交)相关,而不是与您在本地完成的构建计数相关

  • 每个应用程序版本只生成一个版本?@ddriver我不确定是否理解您的评论。顺便说一句,我希望在每个调试版本上增加一个版本字段(例如build),而不是在每个发布版本上增加另一个版本字段(例如次要版本)(这将重置以前的版本字段(build))。我还根据当前VCS版本号添加了一个修订字段。所以,是的,我在每次构建时都会生成一个新的版本号。你的标题中有“version.h”吗?@Rinold是的,它是DAMN。。。我会在周一测试。如果这真的只是一个打字错误,那我就太丢脸了!好吧,这真的只是打字错误。顺便说一句,我已经注意到,即使源代码未经编辑,也会在每次构建时调用该命令(退出时“无需执行任何操作”)。你知道只有在构建真正发生时如何运行自定义目标吗?哦。。我已经用一些解决方案更新了答案,可能适合您的目的。谢谢!我认为QMAKE_POST_链接是一个非常好的解决方案!旁注:1)通过不在.pro中的HEADERS部分列出头文件,可以使用头文件而不触发重建2)更清楚地说,使用QMAKE_POST_链接是使用自定义目标的替代方法3)我使用VCS挂钩进行了一些测试;同样,问题是管理多个子项目(在新提交中,可能只是重建了一些子项目);新鲜的想法是,可以在编译输出上使用diff来判断项目是否已重建;我会在接下来的几天里考虑这个问题……也不要理会我的便条。看起来qmake将在make过程中添加所有的#include-d文件,因此从HEADERS列表中删除它们是不够的
    versiontarget.commands = LaunchTM
    first.depends = $(first) versiontarget
    QMAKE_EXTRA_TARGETS += first versiontarget