2013-03-16 41 views
8

我有我試圖在執行的MSBuild構建目標。目標有一些輸入和輸出,我已經放在那裏以加快中間構建的時間。輸入文件總是存在(頭文件),另一方面,輸出並不總是存在(XML文件)。的MSBuild:目標輸入和輸出失敗在第一次執行

那可能會跳過任務的中間生成是非常可取的,因爲它是在性能方面相當昂貴的。

反正,輸入和輸出工作很好如果輸出已經存在。在這種情況下,MSBuild會發出非常有用的消息,說明由於所有文件都是最新的,因此目標被跳過。

這是當輸出目錄和文件不存在(此任務運行的第一個時間)的MSBuild失敗,出現以下消息的情況下:

跳過target [目標],因爲它沒有輸出。

添加詳細的詳細信息告訴我,原因是因爲@(OutputXML)項是空的。好吧,現在呢?因此,似乎並不像MSBuild中的中級構建的整個概念非常強大。

我的問題是,我怎麼能得到一箇中間構造的利益,仍然有當沒有輸出這一目標的執行? (我希望我沒有訴諸寫我自己的任務擴展)

這裏是我的構建腳本的相關部分:

<ItemGroup> 
    <Headers Include="..\**\*.h" /> 
    <OutputXML Include="$(OutputDir)\*.xml" /> 
</ItemGroup> 

<Target Name="Doxygen" 
     Inputs="@(Headers)" 
     Outputs="@(OutputXML)" > 
    <Exec ... /> 
</Target> 

注: 我一直都對谷歌,msdn和這個網站試圖找到答案,迄今爲止一直不成功。儘管我一般都會發現關於MSBuild的非常有用的信息。

+0

嗨克里斯,無關此帖。我正在與您聯繫以獲得MSBuild的一些幫助。我是MsBuild的新手,並且希望能夠即時生成解決方案文件。我在下面的SO帖子中注意到你提到你有類似的解決方案。你能和我分享嗎?謝謝。 http://stackoverflow.com/questions/13300294/can-i-use-msbuild-scripts-to-replace-sln-files – user559788 2014-05-15 00:38:42

回答

6

有關使用虛擬輸出什麼?

<ItemGroup> 
<Headers Include="..\**\*.h" /> 
<OutputXML Include="$(OutputDir)\*.xml" /> 
</ItemGroup> 

<ItemGroup Condition="'@(OutputXML)' == ''"> 
<OutputXML Include="$(OutputDir)\dummy.xml" /> 
</ItemGroup> 

<Target Name="Doxygen" 
     Inputs="@(Headers)" 
     Outputs="@(OutputXML)" > 
<Exec ... /> 
</Target> 

將OutputDir設置爲dummy.xml時,即使該文件不存在,它也不是空的。通配符表示您正在搜索任何.xml文件,但沒有找到它,但是指定一個特定文件不會執行搜索,因此不在乎它是否存在。

+0

完美工作。謝謝,我不知道你可以重新定義同一個項目。但它效果很好! – 2013-03-18 09:45:51