我有一个包含PreBuild和PostBuild步骤的VS 2015 C ++项目。
此外,我通过" Build Dependencies - >为项目添加了自定义目标。构建定制"。自定义目标运行Perl脚本,该脚本使用英特尔编译器运行nmake构建文件。自定义目标始终运行。具体来说,Perl脚本始终在nmake检查更改时运行,并在输入文件未更改时阻止构建。 调用自定义目标会导致PreBuild和PostBuild运行,即使自定义目标没有生成和新输出(它运行但只执行检查)。
如果我的自定义目标没有产生任何新输出,我想阻止PreBuild和PostBuild运行。到目前为止,我还没有办法做到这一点。
另一个选项是在源未更改时阻止自定义目标运行。不幸的是,英特尔编译器构建的文件标记为" Exclude From Build"因此不会触发自定义目标。我试图定义输入和输入自定义目标运行的任务的输出没有运气。
任何帮助都将受到高度赞赏!
答案 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>
请参阅: