2010-01-22 6 views
2

Позвольте мне начать с примера ... У меня есть all.proj, который выглядит примерно так:MsBuild - Можно ли изолировать пакетные задачи, поэтому одна неудачная задача не пропускает оставшиеся задачи?

<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 не является вариантом, поскольку он просто преобразует ошибки в предупреждения. Я хочу, чтобы сборка завершилась неудачей, но я также хочу получить как можно больше информации об ошибках, поэтому мне все равно нужно скомпилировать все сайты, хотя некоторые из них терпят неудачу.

ответ

3

Единственный способ, которым вы можете это сделать, - обнаружить, когда произошла ошибка. В основном задача должна будет выписать некоторый артефакт или представить вам выходной параметр, где вы можете определить, не удалось ли это или нет. Вы использовали бы это вместе с установкой 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.

+0

Да, это то, что я думал. Вы знаете, лучше ли Нант в этой области? – JohannesH

+0

Извините, я мало знаю о Нанта. –

+0

В результате я написал свою собственную задачу, которая вызывает задачу AspNetCompiler внутри себя. – JohannesH