【发布时间】:2016-08-04 15:14:07
【问题描述】:
对于 C++ 项目,我想自动生成一个带有项目定义的 defs.h 文件,例如日期、git commit 等,以自动化我的应用程序的版本控制过程。
因此,我正在尝试创建一个 MSBuild 目标,它将提取最新的 git 标记、git 提交和当前日期,并将其保存到一个临时的 gitinfo.txt 文件中。
另一个构建目标将依赖于该文件并生成一个 .h 文件。
为了避免对我的项目进行不必要的重新编译,.h 文件和 gitinfo.txt 文件只有在任何信息发生更改时才会被重写。
所以我的想法如下:
- 计算 git 和日期信息
- 如果可用,请阅读现有的
gitinfo.txt - 将计算值与 txt 文件中的值进行比较
- 如果有任何变化,请重写
gitinfo.txt
我已经掌握了第 1 步和第 2 步,但是我不确定如何在阅读后处理这些值。
<!-- The purpose of this target is to update gitinfo.txt if git information (commit...) has changed -->
<Target
Name="GetHeaderInfos"
BeforeTargets="ClCompile"
Outputs="$(IntDir)\gitinfo.txt"
>
<!-- Get information about the state of this repo-->
<GitDescribe>
<Output TaskParameter="Tag" PropertyName="NewGitTag" />
<Output TaskParameter="CommitHash" PropertyName="NewGitCommitHash" />
<Output TaskParameter="CommitCount" PropertyName="NewGitCommitCount" />
</GitDescribe>
<!-- Get the current date -->
<Time Format="dd.MM.yyyy">
<Output TaskParameter="FormattedTime" PropertyName="NewBuildDate" />
</Time>
<ReadLinesFromFile File="$(IntDir)\gitinfo.txt" Condition="Exists('$(IntDir)\gitinfo.txt')">
<Output TaskParameter="Lines" ItemName="Version" />
</ReadLinesFromFile>
<!-- Comparison here! HOW TO DO IT PROPERLY -->
<PropertyGroup>
<TagChanged> <!-- `$(NewGitTag)` == `$(Version)[0]` --> </TagChanged>
<!-- Other comparisons -->
</PropertyGroup>
</Target>
这可能是gitinfo.txt的内容
v4.1.4
04fe34ab
1
31.07.2016
我现在不太确定如何比较这些值。我需要将$(NewGitTag) 与$(Version) 版本变量中的第一个值进行比较,依此类推。
我还没有找到一个示例,它实际上是在从文件中读取变量后访问它们。 official documentation 没有提供任何帮助,我也没有在 stackoverflow 等上找到任何东西。
我只知道$(Version)这个变量有一个列表,我可以批量处理。如何将其内容与定义的变量 $(NewGitTag)、$(NewGitCommitHash)、$(NewGitCommitCount) 和 $(NewBuildDate) 进行比较?
【问题讨论】:
-
另一种方法:将 git 信息和日期写入文件,使用 Exec 任务比较这些文件以调用窗口的 fc.exe 并使用它的返回值来确定文件是否相等,如果不复制文件.像这里的东西:github.com/micropython/micropython/blob/master/windows/msvc/…
-
是的,这将是一种有效的方式。我会试试。但是,我真的很想知道它是如何实现的,也适用于未来的用例。
-
好的,看答案。也许编辑您的问题/标题,以便将来的访问者更容易发现它:基本上它是“如何通过索引访问 ItemGroup 中的项目”,甚至只是“如何比较 ItemGroups”。也可能让它变得更小:你只需从一个 ItemGroup 和一堆项目开始,然后你想比较它们。这些项目是来自文件还是来自 GitDescribe 无关紧要,而且由于并非每个人都有 GitDescribe,因此测试代码变得更加困难。
标签: msbuild