對於C++項目,我想自動生成defs.h
文件,其中包含日期,git commit等項目定義以自動執行應用程序的版本控制過程。MSBuild:比較ItemGroups或按索引訪問
因此,我正在嘗試創建一個MSBuild目標,它將提取最新的git標記,git commit和當前日期,並將其保存到臨時文件gitinfo.txt
。 另一個構建目標將取決於該文件並生成一個.h文件。 爲了避免不必要的重新編譯我的項目,.h文件,因此只有在任何信息發生變化時纔會重寫gitinfo.txt
文件。
所以我的想法是這樣的:
- 計算Git和日期信息
- 如果有的話,在現有的
gitinfo.txt
- 讀取比較計算值與在txt文件
- 如果什麼都改變了,重寫了
gitinfo.txt
我已經掌握了步驟s 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和使用它的返回值來決定,如果這些文件是相等的這些文件,如果沒有複製文件。就像這裏:https://github.com/micropython/micropython/blob/master/windows/msvc/genhdr.targets#L94 – stijn
是的,這將是一種有效的方式。我會嘗試。但是,我真的很想知道它是如何實現的,也是爲了將來的使用情況。 – kiki
好的,看答案。也許可以編輯你的問題/標題,以便未來的訪問者更容易發現它:基本上是'如何通過索引訪問來自ItemGroup的項目',甚至只是'如何比較ItemGroups'。也可以讓它更小:你只需從一個ItemGroup和一堆項目開始,然後你想比較它們。無論這些項目是來自文件還是來自GitDescribe都無關緊要,並且由於不是每個人都有GitDescribe,因此測試代碼變得更加困難。 – stijn