我有一个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>
也可以看看:
如果两者之间存在逻辑关系,则可以使用转换将输入映射到输出:
<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/