我有幾個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之前的同一個問題,但沒有得到明確的答案。
它仍然實現了/ GM選項,它仍然使用了.idb文件。足夠的證據表明依賴性檢查在VS2010中沒有根本改變。 – 2011-03-09 04:08:12
由於與/ MP選項不兼容,我們禁用了項目中的/ Gm選項,因此不會創建.idb文件。 – Hoschie0815 2011-03-09 06:44:51
另外,MSBuild 4.0具有用於生成.tlog文件的增量構建的新文件跟蹤器功能,並且.idb文件不再使用。但是,所有這些僅適用於MSBuild中C++編譯目標的增量構建,而不適用於定製目標的增量構建。 – Hoschie0815 2011-03-09 06:57:27