Visual Studio 2010如何为C ++项目托管MSBuild?

时间:2011-03-09 03:01:24

标签: c++ visual-studio msbuild

我有一个包含多个C ++项目的解决方案。对于某些项目,我需要一些自定义文件副本,例如将一些配置文件复制到输出目录,或者在构建后将一个项目的输出文件复制到特定文件夹。

在某些情况下,我不希望或不能通过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上问过基本相同的问题,但无法得到明确的答案。

2 个答案:

答案 0 :(得分:4)

请参阅this suggestion on Microsoft Connect

基本上,您需要将DisableFastUpToDateCheck属性设置为true以禁用快速检查。

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

<PropertyGroup>  
  <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup>

答案 1 :(得分:1)

通过查看“Microsoft Build Engine,第二版内部”一书,我找到了答案。

注意:我在MSDN forum的问题中也更新了相同内容,但为了完整起见,我将主要在此处复制文本。

在第280页,他们实际上说IDE在项目级别上执行“快速最新检查”。如果这个粗略的项目级别检查失败,它只会生成一个项目构建并对各个任务进行更细粒度的检查。

从命令行运行MSBuild时,总是会对各个工具进行细粒度的最新检查。

因此IDE似乎只对这些文件进行快速检查,这些文件直接添加到项目中并设置为“输入文件”类型之一。

在我看来,这不是一个好的设计。我更喜欢IDE仅用于编辑MSBuild项目文件,然后只调用MSBuild进行最新检查。这样会更清楚。

我可以理解,在一个包含大量项目的解决方案中,它可以更快地进行最新检查,但至少应该有一个禁用快速最新检查的选项。我正在检查IDE是否有办法禁用此行为但找不到任何内容。

解决方案建议here实际上有效,我现在正在使用它。但是我为不同类型的自定义文件添加了几个自定义目标。如果我添加一个新的自定义文件,我永远不会忘记将其设置为“自定义构建工具”,否则此文件的增量构建将不起作用。

我想解决方案是为我的自定义文件进行完整的构建自定义,并为它们使用特定的文件扩展名,这样当我将它们添加到项目并设置正确的项类型时,Visual Studio将自动检测它们。