繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM