Visual studio 如何强制MSBuild不部分生成目标?

Visual studio 如何强制MSBuild不部分生成目标?,visual-studio,msbuild,msbuild-task,Visual Studio,Msbuild,Msbuild Task,我有一个构建过程,它执行以下操作: 在多个(比如10个)COM DLL(一组命名的任务项)上运行TLBIMP。这是我使用Exec任务的“导入”目标 在10个互操作程序集上运行ILDASM。这是我使用Exec任务的“反汇编”目标 运行自定义任务以同时获取所有10个IL文件并对其执行一些操作(详细信息不重要,但此任务必须同时处理所有10个IL文件)。这是我的“工作”目标 使用ILASM将10个IL文件重新组装回10个DLL。这是我的“汇编”目标,使用Exec任务 运行ILMerge将10个程序集合并

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

  • 在多个(比如10个)COM DLL(一组命名的任务项)上运行TLBIMP。这是我使用Exec任务的“导入”目标
  • 在10个互操作程序集上运行ILDASM。这是我使用Exec任务的“反汇编”目标
  • 运行自定义任务以同时获取所有10个IL文件并对其执行一些操作(详细信息不重要,但此任务必须同时处理所有10个IL文件)。这是我的“工作”目标
  • 使用ILASM将10个IL文件重新组装回10个DLL。这是我的“汇编”目标,使用Exec任务
  • 运行ILMerge将10个程序集合并为一个。这是我的“合并”目标,使用Exec任务
  • 当我进行一次干净的重建时,一切都很好。当我执行增量构建时,只有少数原始COM DLL发生了更改,MSBuild只正确地执行了相应目标的部分构建,这些目标的输出相对于其输入而言实际上已经过时


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

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

      <ItemGroup>
        <PrelimIL Include="$(IntermediateOutputPath)intermediate\*.il"/>
      </ItemGroup>
    
    
    
    然后在我的“分解”目标中,有第二个任务:

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

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

    有关如何扩展该属性的更多信息,请参阅我的文章

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

    我的书: