如果输出为空(增量构建),目标将不会运行

问题描述 投票:0回答:1

我有一个增量构建设置。当输出文件不存在时(例如第一次构建),目标不会运行,因为

Outputs="@(MyOutput)"
会导致空列表。为了解决这个问题,我使用这个:

<ItemGroup Condition="'@(MyOutput)' == ''">
   <MyOutput Include="FakeOutputFile.cs" />
</ItemGroup>

有没有更好的方法来解决这个问题?

msbuild
1个回答
0
投票

MSBuild 将始终尝试以一对一的方式将输入文件映射到输出文件。如果它不能做到这一点,它将确保所有输入文件时间戳都早于所有输出文件。

如果您只是一对一映射文件,最好的解决方案是将输入文件直接转换为最终的输出文件目标。

注意:只能通过将

Outputs
属性转换为
Inputs
属性来生成一对一映射。 来源

<ItemGroup>
 <Headers Include="*.file" />
</ItemGroup>

<Target Name="AfterBild" 
        Inputs="@(Headers)"
        Outputs="@(Headers->'$(OutDir)%(FileName).xml')" >
 <!-- Some exe that transforms each .file into .xml -->
 <Exec ... />
</Target>

%(FileName)
只是众所周知的项目元数据的一个示例。

有时您只生成一个输出文件,例如帮助文件,然后您只需将其与最终输出进行比较。我个人用过这个

<ItemGroup>
  <HelpContent Include="$(RepoRoot)\doc\Help\**\*.*" />
</ItemGroup>
<Target Name="BuildHelp" AfterTargets="AfterBuild" Inputs="@(HelpContent)" Outputs="$(OutDir)Help.chm">
    <ItemGroup>
      <SourceFile Include="$(RepoRoot)\doc\Help\Help.chm" />
      <DestinationFile Include="$(OutDir)\Help.chm" />
    </ItemGroup>
  <Exec Command="&quot;$(RepoRoot)\lib\HTML Help Compiler\hhc.exe&quot; &quot;$(RepoRoot)\doc\Help\Help.hhp&quot;" IgnoreExitCode="true" StandardOutputImportance="low" />
  <Move SourceFiles="@(SourceFile)" DestinationFiles="@(DestinationFile)" />
</Target>

如果您需要更具体的帮助,请发表评论,因为我不知道您的目标是什么,除非它是您链接的确切 Doxygen 目标。

© www.soinside.com 2019 - 2024. All rights reserved.