MsBuild - Можно ли изолировать пакетные задачи, чтобы одна неудачная задача не пропускала оставшиеся задачи? - PullRequest
2 голосов
/ 22 января 2010

Позвольте мне начать с примера ... У меня есть all.proj, который выглядит примерно так:

<ItemGroup>
  <ProjectsToBuild Include="..\Sites\*\*.csproj" />
</ItemGroup>

<Target Name="DeployWebsites" DependsOnTargets="BuildMergedSolutions">
  <AspNetCompiler 
    PhysicalPath="%(ProjectsToBuild.RootDir)%(ProjectsToBuild.Directory)"
    TargetPath="%(ProjectsToBuild.RootDir)%(ProjectsToBuild.Directory)..\..\..\deploy\%(ProjectsToBuild.Filename)"
    VirtualPath="/%(ProjectsToBuild.Filename)%(ProjectsToBuild.Extension)"
    Debug="true"
    Updateable="true"
    Force="true" />
</Target>

Если одна из задач не выполнена, она выйдет из цели. Можно ли просто напечатать ошибку и продолжить превышение оставшихся задач?

ContinueOnError не является опцией, поскольку он просто преобразует ошибки в предупреждения. Я хочу, чтобы сборка в конце завершилась неудачно, но я также хочу получить как можно больше информации об ошибках, поэтому мне все еще нужно скомпилировать все сайты, даже если некоторые из них завершатся неудачно.

1 Ответ

3 голосов
/ 22 января 2010

Единственный способ сделать это, если вы можете обнаружить, когда произошла ошибка. По сути, задача должна будет записать какой-либо артефакт или предоставить вам выходной параметр, в котором вы можете указать, произошел сбой или нет. Вы должны использовать это вместе с установкой ContinueOnError в true для самой задачи. Идея состоит в том, чтобы установить для ContinueOnError значение true, разрешить выполнение всех вызовов задачи и затем после этого посмотреть, не было ли ошибки, и действовать соответствующим образом.

Я сделал нечто подобное для выполнения модульных тестов из MSBuild. Я хотел, чтобы все модульные тесты выполнялись во всех тестовых сборках, но также хотел завершить сборку после их завершения. Итак, я установил для ContinueOnError значение true, затем произвел поиск файла XML, в который были записаны результаты, для любых неудачных тестовых случаев, а также собрал сообщения из этого файла.

В вашем случае задача AspNetCompiler не записывает ни один такой файл. AspNetCompiler завершает работу утилиты aspnet_compiler.exe, расширяя ToolTask ​​ (через ToolTaskExtension), чтобы вы могли отслеживать ExitCode. Это довольно сложно без написания собственной задачи по ее расширению. Если вы используете Target Batching, вы можете вызвать задачу AspNetCompiler, а затем записать каждый ExitCode в файл. Затем после этого просмотрите этот файл и найдите ненулевой код выхода. Возможно, вы захотите написать свою собственную пользовательскую задачу, которая расширяет задачу AspNetCompiler и должна быть довольно простой для написания.

Для получения дополнительной информации о пакетировании см. Ресурсы по адресу http://sedotech.com/Resources#Batching.

.
...