0

我有一个构建过程,它执行以下操作:

  1. 在一定数量(比如 10 个)COM DLL(一组命名的任务项)上运行 TLBIMP。这是我使用 Exec 任务的“导入”目标。
  2. 在 10 个互操作程序集上运行 ILDASM。这是我使用 Exec 任务的“反汇编”目标。
  3. 运行自定义任务以同时获取所有 10 个 IL 文件并对它们进行一些处理(细节并不重要,但此任务一起处理所有 10 个 IL 文件至关重要)。这是我的“工作”目标。
  4. 使用 ILASM 将 10 个 IL 文件重新组合成 10 个 DLL。这是我的“组装”目标,使用 Exec 任务。
  5. 运行 ILMerge 以将 10 个程序集合并为一个。这是我的“合并”目标,使用 Exec 任务。

当我进行干净的重建时,一切都很好。当我进行增量构建时,只有少数原始 COM DLL 发生了变化,MSBuild 非常正确地只对适当目标进行了部分构建,因为输出实际上相对于其输入已过时。

有没有一种方法可以让我“强制”MSBuild,只针对一个目标(上面的第 3 步)运行一个传递所有输入的任务,而不仅仅是过时的输入?我不想更改自定义任务的代码以对文件名进行硬编码,我希望将它们作为 MSBuild 脚本中的 TaskItems 提供,但必须为我的自定义任务提供从COM DLL 的原始 TaskItem 组,而不仅仅是使用此特定版本重建的那些。

4

2 回答 2

0

我想我找到了办法。我可以这样定义一个组:

  <ItemGroup>
    <PrelimIL Include="$(IntermediateOutputPath)intermediate\*.il"/>
  </ItemGroup>

然后在我的“反汇编”目标中,有第二个任务:

<Touch Files="@(PrelimIL)" />
于 2009-05-21T20:26:17.903 回答
0

在执行目标之前,您似乎走在了正确的轨道上。由于输入文件最近已被修改(通过您的触摸),因此目标的所有输出都被完全重建。您可以做的另一种方法是创建一个目标,即CleanIntFiles,它将删除这些文件。然后,您可以将该目标放在BeforeBuildDependsOn属性上。

有关如何扩展该属性的更多信息,请查看我的文章Inside MSBuild

赛义德·易卜拉欣·哈希米

我的书:Microsoft Build Engine 内部:使用 MSBuild 和 Team Foundation Build

于 2009-05-22T04:09:18.613 回答