【发布时间】:2011-03-09 03:01:23
【问题描述】:
我有几个 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 上问过基本相同的问题,但无法得到明确的答案。
【问题讨论】:
-
它仍然实现 /Gm 选项,它仍然使用 .idb 文件。有足够的证据表明依赖检查在 VS2010 中没有发生根本性的变化。
-
我们在项目中禁用了 /Gm 选项,因为它与 /MP 选项不兼容,因此不会创建 .idb 文件。
-
此外,MSBuild 4.0 具有新的文件跟踪器功能,用于生成 .tlog 文件并且不再使用 .idb 文件的增量构建。但这一切应该只适用于 MSBuild 中 C++ 编译目标的增量构建,而不适用于自定义目标的增量构建。
-
您的自定义文件是否包含在 C++ 项目中?
-
包含了一些自定义文件,但其他一些文件不应包含在 C++ 项目中。
标签: c++ visual-studio msbuild