Может ли msbuild скомпилировать задачи сборки и затем использовать их? - PullRequest
1 голос
/ 23 февраля 2012

У меня есть задача сборки , которую я хотел бы включить в мой сценарий msbuild .Я хотел бы, чтобы CI сначала скомпилировал Задачи сборки , прежде чем пытаться использовать их, чтобы любые добавленные новые задачи сборки были доступны, а фактическую сборку не нужно было компилировать и фиксировать в CI машина.Я пробовал что-то вроде этого.

<Target Name="SetupEnv">
    <MSBuild Targets="Build" Projects="FooBuildTasks\BuildTasks.sln" />
      <UsingTask TaskName="Foo.BarTask" AssemblyFile="$(MSBuildProjectDirectory)\BuildTasks\FooBuildTasks\bin\Release\FooBuildTasks.dll"/>
    <BarTask Variable="Test" Value="I'm Alive" />
  </Target>

Это создает файл сборки задач, но затем кажется, что задача UsingTask не может быть запущена в Target .

ошибка MSB4036: задача «UsingTask» не найдена.Проверьте следующее: 1.) Имя задачи в файле проекта - sa ...

Есть ли какое-нибудь хорошее решение в этом отношении?Если я запускаю UsingTask в Project , он будет работать нормально, если я предварительно скомпилировал сборку Tasks до этого.

Используемая платформа msbuild - 3,5

Ответы [ 2 ]

3 голосов
/ 23 февраля 2012

Установите свойство OutDir явно:

    <MSBuild Targets="Build" Projects="FooBuildTasks\BuildTasks.sln" 
             Properties="Configuration=Release;OutDir=$(MSBuildProjectDirectory)\BuildTasks\FooBuildTasks\bin\Release\" />

Кроме того, элемент <UsingTask> должен быть объявлен вне <Target>

2 голосов
/ 23 февраля 2012

Вам нужно построить два шага или использовать встроенные задачи.Двухэтапная сборка включает в себя разбиение вашей сборки на цель «Настроить», которая предварительно строит ваши задачи сборки, и цель «CoreBuild», которая выполняет вашу сборку.

Используя любой из приведенных ниже методов, вы должны убедиться, чтоЦель "Confugure" не требует каких-либо пользовательских задач, которые она построила.

1) Используйте цель "Build" для запуска двухэтапной сборки:

 <Target Name="Configure">
   <MSBuild Projects="PathTo/CustomBuidTasks.csproj" Target="Build" />
 </Target>

 <Target Name="CoreBuild">
   <MSBuild Projects="@(ItemsToBuild)" Target="Build" />
 </Target>

 <Target Name="Build">
   <MSBuild Projects="$(MSBuildThisFile)" Target="Configure" />
   <MSBuild Projects="$(MSBuildThisFile)" Target="CoreBuild" />
 </Target>

2)Настройте свою систему CI для выполнения двухэтапной сборки за вас, по сути дублируя вышеперечисленное с использованием рабочего процесса CI, сначала запустив MSBuild с целью «Configure», затем отдельно выполнив более традиционную цель «Build».* 3) Другой подход заключается в использовании встроенных задач в MSBuild.Поместив код задачи в файл MSBuild, механизм скомпилирует его для вас при первом выполнении задачи.

Извлечено из MSBuild Trickery трюки # 6 и # 32

...