2014-09-05 46 views
0

MSBuild擅長檢測給定文件何時需要重新構建,因爲它已更改。有沒有可能讀取文件的內容以確定它依賴於什麼? (我在想// referencesusing@import聲明)。從MSBuild中的文件中讀取依賴關係

我有一個功能較少的文件構建目標(一個方便的方式來重新使用我寫的NancyFX靜態資源約定生成器)。但是,當我更改文件的上游文件時,我確實感興趣,因爲MSBuild不知道依賴關係。

你可以在MSBuild中指定更復雜的依賴關係嗎?

回答

2

如果輸入文件的進程列表,以及相關文件相關的列表,如這個項目定義:

<ItemDefinitionGroup> 
    <XFiles> 
    <OutputFile>$(OutDir)%(RelativeDir)%(Filename).xprocessed</OutputFile> 
    <Dependency>%(RelativeDir)%(Filename)-SupportFile.xdep</Dependency> 
    </XFiles> 
</ItemDefinitionGroup> 

您可以在文件中指定依賴的目標將在頭輸出目標是這樣的:

<Target Name="ProcessXFilesAndDependencies" 
     Inputs="@(XFiles);@(XFiles->'%(Dependency)')" 
     Outputs="@(XFiles->'%(OutputFile)')"> 

    <!-- process stuff --> 

</Target> 

這將考慮到您的版本的文件和相關文件的狀態。

如果我沒有弄錯,以這種方式設置你的目標會導致它在所有情況下被評估。由於輸入和輸出文件之間沒有1:1的關係(總是會有更少的輸出文件),MSBuild不能跳過這個目標。這會對你所有的構建造成小的開銷,但通常可以忽略不計。

+0

好吧,但有MSbuild自動生成這樣一個基於文件內容的定義組? – Crisfole 2014-09-05 15:29:05

+1

當然,我應該專門提出你問的問題,而不是直接深入相關細節。如果你希望它是動態的,你將不得不創建一個目標,根據文件內容自行獲取依賴項。使用DependsOnTargets將處理目標前面的依賴性採購目標鏈接起來。使用ReadLinesFromFile可能正好是門票(當然還有一些腳本)。 – d3r3kk 2014-09-05 16:16:03

+0

我已經有自定義的任務,幫助編譯,並做了一些它自己的依賴性嗅探。我重構了一下,將它作爲一個任務公開,並使目標依賴於另一個動態生成依賴關係的目標。你讓我走下正確的軌道,謝謝。 – Crisfole 2014-09-05 16:39:50