VS 2015"构建依赖关系 - >构建定制"总是触发PreBuild和PostBuild

时间:2017-02-05 14:02:13

标签: c++ visual-studio-2015 post-build-event nmake custom-build-step

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

此外,我通过" Build Dependencies - >为项目添加了自定义目标。构建定制"。自定义目标运行Perl脚本,该脚本使用英特尔编译器运行nmake构建文件。自定义目标始终运行。具体来说,Perl脚本始终在nmake检查更改时运行,并在输入文件未更改时阻止构建。 调用自定义目标会导致PreBuild和PostBuild运行,即使自定义目标没有生成和新输出(它运行但只执行检查)。

如果我的自定义目标没有产生任何新输出,我想阻止PreBuild和PostBuild运行。到目前为止,我还没有办法做到这一点。

另一个选项是在源未更改时阻止自定义目标运行。不幸的是,英特尔编译器构建的文件标记为" Exclude From Build"因此不会触发自定义目标。我试图定义输入和输入自定义目标运行的任务的输出没有运气。

任何帮助都将受到高度赞赏!

1 个答案:

答案 0 :(得分:1)

确保您的自定义目标具有“输入和输出”属性,该属性可以正确描述哪些文件将用作输入,哪一个是结果输出。 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>  

请参阅: