[英]VS 2015 "Build Dependencies -> Build Customization" always triggers PreBuild and PostBuild
我有一个包含 PreBuild 和 PostBuild 步骤的 VS 2015 C++ 项目。
此外,我通过“构建依赖项-> 构建自定义”将自定义目标添加到项目中。 自定义目标运行 Perl 脚本,该脚本使用英特尔编译器运行 nmake 构建文件。 自定义目标始终运行。 具体而言,当 nmake 检查更改并在输入文件未更改时阻止构建时,Perl 脚本始终运行。 调用自定义目标会导致 PreBuild 和 PostBuild 运行,即使自定义目标没有产生新的输出(它运行但只执行检查)。
如果我的自定义目标没有产生任何新输出,我想阻止 PreBuild 和 PostBuild 运行。 到目前为止,我还没有找到一种方法来做到这一点。
另一种选择是在源未更改的情况下阻止自定义目标运行。 不幸的是,由英特尔编译器构建的文件被标记为“从构建中排除”,因此不会触发自定义目标。 我试图为自定义目标运行的任务定义输入和输出,但没有运气。
任何帮助将不胜感激!
确保您的自定义目标具有 Inputs 和 Outputs 属性,该属性正确描述了哪些文件将用作输入以及哪些是结果输出。 MsBuild 将使用这些文件上的时间戳来决定您是否真的更改了任何内容。 这些文件上的时间戳必须早于作为目标输出生成的文件,这就是 MsBuild 的决定方式。
例子:
<Target Name="Custom"
Inputs="@(CSFile)"
Outputs="hello.exe">
<Csc
Sources="@(CSFile)"
OutputAssembly="hello.exe"/>
</Target>
也可以看看:
如果两者之间存在逻辑关系,您可以使用转换将输入映射到输出:
<Target Name="Convert"
Inputs="@(TXTFile)"
Outputs="@(TXTFile->'%(Filename).content')">
<GenerateContentFiles
Sources = "@(TXTFile)">
<Output TaskParameter = "OutputContentFiles"
ItemName = "ContentFiles"/>
</GenerateContentFiles>
</Target>
不要依赖 BeforeTargets 和 AfterTargets 并且永远不要依赖PreBuildEvent
,因为该目标本身没有任何输入或输出,因此总是触发,它们是源自 2003 年的相当古老的构造,而是覆盖BuildDependsOn
并注入您的目标链中。
例子:
<PropertyGroup>
<BuildDependsOn>
Convert;
$(BuildDependsOn);
</BuildDependsOn>
</PropertyGroup>
看:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.