2009-05-21 4 views
0

У меня есть процесс сборки, который выполняет следующие действия:Как заставить MSBuild не создавать цель частично?

  1. пробегов TLBIMP по ряду (скажем, 10) COM библиотек DLL (именованная группа TaskItems). Это моя цель «Импорт», которая использует задачу Exec.
  2. Выполняет ILDASM на 10 собраниях. Это моя цель «Разборка», которая использует задачу Exec.
  3. Запускает пользовательскую задачу, чтобы одновременно взять все 10 файлов IL и выполнять некоторую работу над ними (детали не важны, но очень важно, чтобы все 10 файлов IL обрабатывались вместе этой задачей). Это моя цель «Работа».
  4. Восстанавливает 10 файлов IL с использованием ILASM, обратно в 10 DLL. Это моя цель «Собрать», использует задачу Exec.
  5. Запуск ILMerge для объединения 10 сборок в один. Это моя цель «Слияние», использует задачу Exec.

Все отлично и денди, когда я делаю чистую перестройку. Когда я делаю инкрементную сборку, и только некоторые из исходных COM-библиотек изменились, MSBuild вполне корректно выполняет только частичные сборки соответствующих целей, для выходов, которые фактически устарели по отношению к их Входам.

Есть ли способ, которым я могу «заставлять» MSBuild только для одной цели (шаг 3 выше) для запуска задачи, передающей все входы вместо устаревших? Я не хочу изменять код моей настраиваемой задачи, чтобы жестко закодировать имена файлов, я бы хотел, чтобы они были предоставлены в качестве TaskItems из сценария MSBuild, но моей пользовательской задаче нужно предоставить ВСЕ входные данные, полученные из исходную группу TaskItem из COM-библиотек, а не только те, которые были перестроены с помощью этой конкретной сборки.

ответ

0

Я думаю, что нашел путь. Я могу определить группу, таким образом:

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

А потом в моей «Разберите» цель, иметь вторую задачу:

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

Вы, кажется, чтобы быть на правильном пути прикасаясь файлы перед вашей цели выполняется. Так как входные файлы были изменены (по вашему прикосновению) совсем недавно, то все выходы цели полностью перестроены. Другим подходом, который вы можете сделать, является создание цели, то есть CleanIntFiles, которая удалит эти файлы. Затем вы можете разместить эту цель на объекте BeforeBuildDependsOn.

Для получения дополнительной информации о том, как расширить это свойство, взгляните на мою статью Inside MSBuild.

Сайед Ибрагим Хашими

My Book: Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

Смежные вопросы