我有一个增量构建设置。当输出文件不存在时(例如第一次构建),目标不会运行,因为
Outputs="@(MyOutput)"
会导致空列表。为了解决这个问题,我使用这个:
<ItemGroup Condition="'@(MyOutput)' == ''">
<MyOutput Include="FakeOutputFile.cs" />
</ItemGroup>
有没有更好的方法来解决这个问题?
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=""$(RepoRoot)\lib\HTML Help Compiler\hhc.exe" "$(RepoRoot)\doc\Help\Help.hhp"" IgnoreExitCode="true" StandardOutputImportance="low" />
<Move SourceFiles="@(SourceFile)" DestinationFiles="@(DestinationFile)" />
</Target>
如果您需要更具体的帮助,请发表评论,因为我不知道您的目标是什么,除非它是您链接的确切 Doxygen 目标。