1

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

此外,我通过“构建依赖项-> 构建自定义”将自定义目标添加到项目中。自定义目标运行一个 Perl 脚本,该脚本使用英特尔编译器运行 nmake 构建文件。自定义目标始终运行。具体来说,Perl 脚本总是在 nmake 检查更改并在输入文件未更改时阻止构建时运行。调用自定义目标会导致 PreBuild 和 PostBuild 运行,即使自定义目标没有产生新的输出(它运行但除了检查什么都不做)。

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

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

任何帮助将不胜感激!

4

1 回答 1

1

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

看:

于 2017-02-05T14:32:00.763 回答