2011-03-09 69 views
1

我有幾個C++項目的解決方案。對於某些項目,我需要一些自定義文件副本,例如將一些配置文件複製到輸出目錄或在構建後將一個項目的輸出文件複製到特定文件夾。Visual Studio 2010如何爲C++項目託管MSBuild?

在某些情況下,我不想或不能直接通過Visual Studio IDE將這些文件添加到項目中。我創建了簡單的.targets文件,我可以重複使用並將其添加到需要文件複製的項目中。

下面是一個簡單的例子.targets文件複製配置文件:

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
<PropertyGroup> 
<BuildDependsOn> 
    $(BuildDependsOn); 
    CopyCustom 
</BuildDependsOn> 
</PropertyGroup> 
<ItemGroup> 
<CustomFiles Include="$(ProjectDir)Config\**\*.xml" /> 
</ItemGroup> 
<PropertyGroup> 
<DestCustFolder>$(OutDir)Config\</DestCustFolder> 
</PropertyGroup> 
<Target Name="CopyCustom" 
Inputs="@(CustomFiles)" 
Outputs="@(CustomFiles ->'$(DestCustFolder)%(RecursiveDir)%(FileName)%(Extension)')"> 
<Message Text="Copy custom files..." /> 
<Copy SourceFiles="@(CustomFiles)" DestinationFiles="@(CustomFiles->'$(DestCustFolder)%(RecursiveDir)%(FileName)%(Extension)')" SkipUnchangedFiles="true" /> 
</Target> 
</Project> 

通過Visual Studio中的「生成自定義」對話框我是在末尾添加到項目中,因此將被納入這樣的項目文件:

<ImportGroup Label="ExtensionTargets"> 
<Import Project="..\Targets\CopyCustom.targets" />/ 
</ImportGroup> 

這應該啓用我的自定義目標的增量構建。如果我只是編輯的我的自定義文件中的一個(且沒有C++的文件),並建立它形成

msbuild foo1.vcxproj 

控制檯它實際上將檢測到的變化和不增量構建爲我的自定義的目標。如果沒有更改,則跳過目標。

如果我然而建立在Visual Studio中它不會檢測到更改自定義文件,並僅給了我,該項目是最多數據的消息:

========== Build: 0 succeeded, 0 failed, 5 up-to-date, 0 skipped ========== 

我會另外改變一個的C++文件,使其再次檢查所有目標和增量構建。

我在期待Visual Studio只是執行MSBuild,然後它會對項目進行最新檢查,所以它應該與從控制檯運行MSBuild的結果相同。我試圖通過將詳細級別設置爲診斷來獲得更多信息,但我只是得到相同的一行。在我看來,MSBuild甚至沒有爲該項目執行,但Visual Studio本身確定該項目是最新的。

所以我想知道Visual Studio是如何確定何時應該爲項目執行MSBuild的。

我基本上詢問MSDN forum之前的同一個問題,但沒有得到明確的答案。

+0

它仍然實現了/ GM選項,它仍然使用了.idb文件。足夠的證據表明依賴性檢查在VS2010中沒有根本改變。 – 2011-03-09 04:08:12

+0

由於與/ MP選項不兼容,我們禁用了項目中的/ Gm選項,因此不會創建.idb文件。 – Hoschie0815 2011-03-09 06:44:51

+0

另外,MSBuild 4.0具有用於生成.tlog文件的增量構建的新文件跟蹤器功能,並且.idb文件不再使用。但是,所有這些僅適用於MSBuild中C++編譯目標的增量構建,而不適用於定製目標的增量構建。 – Hoschie0815 2011-03-09 06:57:27

回答

4

請參閱this suggestion on Microsoft Connect

基本上,您需要將DisableFastUpToDateCheck屬性設置爲true以禁用快速更新檢查。

只需添加到您的vcxproj或你的目標文件:

<PropertyGroup> 
    <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck> 
</PropertyGroup> 
+0

謝謝我一段時間沒有回來查看。其實我是在Microsoft Connect上撰寫建議的人:-) – Hoschie0815 2012-02-16 13:29:35

1

我找到了一本書「Inside the Microsoft Build Engine,Second Edition」一書的答案。

注意:我也在MSDN forum的問題中更新了相同的內容,但爲了完整性,我將主要複製文本。

在頁280上,他們實際上說IDE在項目級別上執行「快速最新檢查」。它只產生一個項目構建,並在這個粗略的項目級別檢查失敗時對單個任務進行更細粒度的檢查。

從命令行運行MSBuild時,總是會對各個工具進行細化的最新檢查。

因此,IDE似乎只是快速檢查直接添加到項目並設置爲「輸入文件」類型之一的文件。

在我看來這不是一個好的設計。我更喜歡IDE僅用於編輯MSBuild項目文件,然後調用MSBuild來執行最新的檢查。這會使它更清晰。

我可以理解,在一個包含大量項目的解決方案中,它可以使最新的檢查速度更快,但至少應該有一個選項來禁用最新的最新檢查。我正在檢查IDE是否有辦法禁用此行爲,但找不到任何東西。

解決方案建議here實際工作,我目前正在使用它。但我爲不同類型的自定義文件添加了幾個自定義目標。如果我添加一個新的自定義文件,我不應該忘記將其設置爲「自定義構建工具」,否則此文件的增量構建將無法工作。

我想一個解決方案是爲我的自定義文件進行完整的構建自定義,併爲它們使用特定的文件擴展名,以便Visual Studio在將它們添加到項目並設置正確的項目類型時自動檢測它們。

+0

有一個選項可禁用快速最新檢查。請參閱下面的答案。 – 2011-08-21 09:15:21

相關問題