首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VS 2015“构建依赖项->构建自定义”总是触发PreBuild和PostBuild

VS 2015“构建依赖项->构建自定义”总是触发PreBuild和PostBuild
EN

Stack Overflow用户
提问于 2017-02-05 14:02:13
回答 1查看 1.1K关注 0票数 1

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

此外,我还通过“构建依赖项->构建自定义”将自定义目标添加到项目中。Custom运行一个Perl脚本,它使用Intel编译器运行nmake构建文件。自定义目标总是运行。具体来说,Perl脚本总是在nmake检查更改时运行,如果输入文件没有更改,则阻止生成。调用自定义目标会导致PreBuild和PostBuild运行,即使自定义目标没有生成和新输出(它运行,但只执行检查)。

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

另一个选项是,如果源没有更改,则阻止自定义目标运行。不幸的是,Intel编译器生成的文件被标记为“从构建中排除”,因此不会触发自定义目标。我试图为自定义目标运行的任务定义输入和输出,但没有成功。

任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2017-02-05 14:32:00

确保您的自定义目标有一个输入和输出属性,它正确地描述了哪些文件将用作输入,哪些文件是结果输出。MsBuild将使用这些文件上的时间戳来决定您是否实际更改了任何内容。这些文件上的时间戳必须比作为目标输出而生成的文件更早,这就是MsBuild的决定。

示例:

代码语言:javascript
复制
<Target Name="Custom"   
    Inputs="@(CSFile)"   
    Outputs="hello.exe">  

    <Csc  
        Sources="@(CSFile)"   
        OutputAssembly="hello.exe"/>  
</Target>  

另请参阅:

如果两者之间存在逻辑关系,则可以使用转换将输入映射为输出:

代码语言:javascript
复制
<Target Name="Convert"  
    Inputs="@(TXTFile)"  
    Outputs="@(TXTFile->'%(Filename).content')">  

    <GenerateContentFiles  
        Sources = "@(TXTFile)">  
        <Output TaskParameter = "OutputContentFiles"  
            ItemName = "ContentFiles"/>  
    </GenerateContentFiles>  
</Target>  

不要依赖BeforeTargets和AfterTargets,也不要依赖PreBuildEvent,因为目标本身没有任何输入或输出,因此总是触发器,它们是源自2003年的旧构造,相反,重写BuildDependsOn并将目标注入链中。

示例:

代码语言:javascript
复制
<PropertyGroup>
    <BuildDependsOn>
        Convert;
        $(BuildDependsOn);
    </BuildDependsOn>
</PropertyGroup>  

请参见:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42052952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档