![](/img/trans.png)
[英]Visual Studio 2019 not copying changed and compiled dll to startup project's bin folder in x64 target
[英]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.