我有一个包含多个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上问过基本相同的问题,但无法得到明确的答案。
答案 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将自动检测它们。