簡體   English   中英

自定義構建規則<outputs>標記檢查 Visual Studio 2019 中更改的目錄?</outputs>

[英]Rules for Custom build's <Outputs> tag check for directories changed in Visual Studio 2019?

讓我們把晦澀的問題變得簡單......

我們有一個由許多項目組成的解決方案,其中一些項目使用 3rd 方的東西設置了自定義構建事件,用於一些黑暗魔法編譯,看起來像這樣:

<CustomBuild Include="..\folder\somestuff.xyz">
  <FileType>Document</FileType>
  <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">C:\Tcl\bin\tclsh.exe $(APP_PATH)\modules\APP\bin\generator.tcl -o %(RelativeDir)%(Filename) %(RelativeDir)%(Filename).xyz</Command>
  <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">APPGEN %(RelativeDir)%(Filename)</Message>
  <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(RelativeDir)%(Filename).cpp;%(RelativeDir)%(Filename).h;%(RelativeDir)%(Outputs)</Outputs>
</CustomBuild>

這一直正常工作,直到我們從 VS2015 切換到 VS2019,因為現在在編譯期間它報告說: Project is not up-to-date: build output 'd:\projects\program\app\src\plugins\shared\' is missing . 這或多或少沒問題,但它迫使編譯器也重新編譯這個項目的依賴項,這開始真的很煩人,因為即使沒有進行任何更改,每次都需要重建幾個項目。

我發現問題出在這行自定義構建:

<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(RelativeDir)%(Filename).cpp;%(RelativeDir)%(Filename).h;%(RelativeDir)%(Outputs)</Outputs>

從這部分更准確地說: %(RelativeDir)%(Outputs)作為在同一標記中檢查.cpp.h文件不會產生任何問題。 所以我刪除了這個目錄檢查。 刪除這段代碼后,項目會正確編譯,並且不會整天重新編譯。

那么為什么自定義版本的 Output 檢查現在可以正常工作,只是文件和目錄會產生這種問題?

是的,檢查的目錄存在,它指的是現有的正確路徑。

真正的問題是,由於元數據Outputs ,您的真實項目總是在重建。

特別的一點是,你應該確保Outputs的值的有效性和合法性。

問題在%(RelativeDir) %(RelativeDir)%(Outputs)的 %(RelativeDir) 之下。 添加它時, outputs具有非法文件夾結構而不是文件,這使得outputs始終找到丟失的非法文件夾結構,從而導致項目始終重建。

讓我詳細描述一下,

當 msbuild 讀取outputs屬性時,當它讀取到%(RelativeDir)%(Filename).cpp;%(RelativeDir)%(Filename).h;%(RelativeDir)時, Outputs的值是這樣的:

..\folder\somestuff.cpp;..\folder\somestuff.h;..\folder\

然后,它讀取%(Outputs) (讀取自身),這更像是將上述值復制兩次:

..\folder\somestuff.cpp;..\folder\somestuff.h;..\folder\..\folder\somestuff.cpp;..\folder\somestuff.h;..\folder\

你會發現最后一部分..\folder\不是一個文件,它是一個文件夾結構,對於outputs來說是非法的。

這就是原因。

它更像是您的問題文件夾結構d:\projects\program\app\src\plugins\shared\丟失。

建議

所以你不應該再次添加outputs

<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(RelativeDir)%(Filename).cpp;%(RelativeDir)%(Filename).h;</Outputs>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM