AFAIK MSBuild не имеет встроенной поддержки для получения количества предупреждений в заданной точке сценария сборки. Однако вы можете выполнить следующие шаги для достижения этой цели:
- Создание собственного регистратора, который прослушивает событие предупреждения и подсчитывает количество предупреждений
- Создание пользовательской задачи, которая предоставляет свойство [Output] WarningCount
- Пользовательская задача каким-то образом получает значение счетчика предупреждений из пользовательского регистратора
Самый сложный шаг - это шаг 3. Для этого есть несколько вариантов, и вы можете свободно искать их в разделе IPC - Межпроцессное взаимодействие. Следует рабочий пример того, как вы можете достичь этого. Каждый предмет - это отдельная библиотека классов .
SharedMemory
http://weblogs.asp.net/rosherove/archive/2003/05/01/6295.aspx
Я создал оболочку для named
общая память, которая была частью
крупный проект. Это в основном позволяет
сериализованные типы и графы объектов для
храниться в и извлекаться из общего
память (в том числе, как и следовало ожидать
перекрестный процесс). Будь больше
когда-либо завершается проект еще один
материя; -).
SampleLogger
Реализует пользовательский регистратор, который отслеживает количество предупреждений.
namespace SampleLogger
{
using System;
using Microsoft.Build.Utilities;
using Microsoft.Build.Framework;
using DM.SharedMemory;
public class MySimpleLogger : Logger
{
private Segment s;
private int warningCount;
public override void Initialize(IEventSource eventSource)
{
eventSource.WarningRaised += new BuildWarningEventHandler(eventSource_WarningRaised);
this.s = new Segment("MSBuildMetadata", SharedMemoryCreationFlag.Create, 65535);
this.s.SetData(this.warningCount.ToString());
}
void eventSource_WarningRaised(object sender, BuildWarningEventArgs e)
{
this.warningCount++;
this.s.SetData(this.warningCount.ToString());
}
public override void Shutdown()
{
this.s.Dispose();
base.Shutdown();
}
}
}
SampleTasks
Реализует пользовательскую задачу, которая считывает количество предупреждений, выданных в проекте MSbuild. Настраиваемая задача читает из общей памяти, записанной настраиваемым регистратором, реализованным в библиотеке классов SampleLogger .
namespace SampleTasks
{
using System;
using Microsoft.Build.Utilities;
using Microsoft.Build.Framework;
using DM.SharedMemory;
public class BuildMetadata : Task
{
public int warningCount;
[Output]
public int WarningCount
{
get
{
Segment s = new Segment("MSBuildMetadata", SharedMemoryCreationFlag.Attach, 0);
int warningCount = Int32.Parse(s.GetData() as string);
return warningCount;
}
}
public override bool Execute()
{
return true;
}
}
}
Идем на спин.
<?xml version="1.0" encoding="UTF-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Main">
<UsingTask TaskName="BuildMetadata" AssemblyFile="F:\temp\SampleLogger\bin\debug\SampleTasks.dll" />
<Target Name="Main">
<Warning Text="Sample warning #1" />
<Warning Text="Sample warning #2" />
<BuildMetadata>
<Output
TaskParameter="WarningCount"
PropertyName="WarningCount" />
</BuildMetadata>
<Error Text="A total of $(WarningCount) warning(s) were raised." Condition="$(WarningCount) > 0" />
</Target>
</Project>
Если вы выполните следующую команду:
c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild test.xml /logger:SampleLogger.dll
Это будет вывод:
Microsoft (R) Build Engine Version 2.0.50727.3053
[Microsoft .NET Framework, Version 2.0.50727.3053]
Copyright (C) Microsoft Corporation 2005. All rights reserved.
Build started 30-09-2008 13:04:39.
__________________________________________________
Project "F:\temp\SampleLogger\bin\debug\test.xml" (default targets):
Target Main:
F:\temp\SampleLogger\bin\debug\test.xml : warning : Sample warning #1
F:\temp\SampleLogger\bin\debug\test.xml : warning : Sample warning #2
F:\temp\SampleLogger\bin\debug\test.xml(15,3): error : A total of 2 warning(s) were raised.
Done building target "Main" in project "test.xml" -- FAILED.
Done building project "test.xml" -- FAILED.
Build FAILED.
F:\temp\SampleLogger\bin\debug\test.xml : warning : Sample warning #1
F:\temp\SampleLogger\bin\debug\test.xml : warning : Sample warning #2
F:\temp\SampleLogger\bin\debug\test.xml(15,3): error : A total of 2 warning(s) were raised.
2 Warning(s)
1 Error(s)
Time Elapsed 00:00:00.01