Build Customization"总是触发 PreBuild 和 PostBuild-6ren"> Build Customization"总是触发 PreBuild 和 PostBuild-我有一个包含 PreBuild 和 PostBuild 步骤的 VS 2015 C++ 项目。 此外,我通过“Build Dependencies -> Build Customization”将自定-6ren">
gpt4 book ai didi

c++ - VS 2015 "Build Dependencies -> Build Customization"总是触发 PreBuild 和 PostBuild

转载 作者:行者123 更新时间:2023-11-30 05:17:50 25 4
gpt4 key购买 nike

我有一个包含 PreBuild 和 PostBuild 步骤的 VS 2015 C++ 项目。

此外,我通过“Build Dependencies -> Build Customization”将自定义目标添加到项目中。自定义目标运行一个 Perl 脚本,该脚本使用英特尔编译器运行 nmake 构建文件。自定义目标始终运行。具体来说,Perl 脚本始终运行,同时 nmake 检查更改并在输入文件未更改时阻止构建。调用自定义目标会导致 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 并将您的目标注入(inject)链中。

例子:

<PropertyGroup>
<BuildDependsOn>
Convert;
$(BuildDependsOn);
</BuildDependsOn>
</PropertyGroup>

参见:

关于c++ - VS 2015 "Build Dependencies -> Build Customization"总是触发 PreBuild 和 PostBuild,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42052952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com