如何强制MSBuild不部分构建目标?

时间:2009-05-21 20:03:27

标签: visual-studio msbuild msbuild-task

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

  1. 在一个(例如10个)COM DLL(一个命名的TaskItems组)上运行TLBIMP。这是我使用Exec任务的“导入”目标。
  2. 在10个互操作程序集上运行ILDASM。这是我使用Exec任务的“反汇编”目标。
  3. 运行自定义任务以同时获取所有10个IL文件并对它们进行一些操作(详细信息并不重要,但通过此任务一起处理所有10个IL文件至关重要)。这是我的“工作”目标。
  4. 使用ILASM将10个IL文件重新组装回10个DLL。这是我的“Assemble”目标,使用Exec任务。
  5. 运行ILMerge将10个程序集合并为一个。这是我的“合并”目标,使用Exec任务。
  6. 当我进行干净的重建时,一切都很好,花花公子。当我进行增量构建,并且只有一些原始COM DLL发生了变化时,MSBuild非常正确地仅对适当的目标进行部分构建,对于实际上与其输入相关的输出。

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

2 个答案:

答案 0 :(得分:0)

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

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

然后在我的“反汇编”目标中,完成第二项任务:

<Touch Files="@(PrelimIL)" />

答案 1 :(得分:0)

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

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

Sayed Ibrahim Hashimi

我的书:Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build