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

另外,我还通过“构建依赖关系->构建自定义”将自定义目标添加到了项目中。自定义目标运行一个Perl脚本,该脚本使用Intel Compiler运行nmake构建文件。定制目标始终运行。具体来说,Perl脚本始终在nmake检查更改时运行,并在输入文件未更改的情况下阻止构建。
即使自定义目标没有产生新的输出(已运行但只进行检查却没有执行),调用自定义目标也会导致PreBuild和PostBuild运行。

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

另一个选择是在源未更改的情况下阻止自定义目标运行。不幸的是,英特尔编译器生成的文件被标记为“从生成中排除”,因此不会触发自定义目标。我尝试为由自定义目标运行的任务定义输入和输出,但是没有运气。

任何帮助将不胜感激!

最佳答案

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

例:

<Target Name="Custom"
    Inputs="@(CSFile)"
    Outputs="hello.exe">

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

也可以看看:
  • https://msdn.microsoft.com/en-us/library/ms171483.aspx

  • 如果两者之间存在逻辑关系,则可以使用转换将输入映射到输出:
    <Target Name="Convert"
        Inputs="@(TXTFile)"
        Outputs="@(TXTFile->'%(Filename).content')">
    
        <GenerateContentFiles
            Sources = "@(TXTFile)">
            <Output TaskParameter = "OutputContentFiles"
                ItemName = "ContentFiles"/>
        </GenerateContentFiles>
    </Target>
    
  • https://msdn.microsoft.com/en-us/library/ms171483.aspx

  • 不要依赖BeforeTargets和AfterTargets,也不要依赖PreBuildEvent,因为该目标本身没有任何输入或输出,因此总是触发,它们是非常古老的构造,源自2003年时代,而是重写BuildDependsOn并注入(inject)目标在链中。

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

    看到:
  • https://blogs.msdn.microsoft.com/msbuild/2006/02/10/how-to-add-custom-process-at-specific-points-during-build-method-2/
  • 关于c++ - VS 2015 “Build Dependencies -> Build Customization”始终触发PreBuild和PostBuild,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42052952/

    10-11 22:36