Hay un script MSBuild, que incluye número si proyectos Delphi y C#, pruebas unitarias, etc.MSBuild: ¿Cómo obtener el número de advertencias planteadas?
El problema es: cómo marcar la compilación falló si se generaron advertencias (para propósitos de prueba, no para compilaciones de versiones). Usar LogError en lugar de LogWarning en tareas personalizadas no parece ser una buena opción, ya que la compilación debería probar tanto como sea posible (hasta un error real) para informar tantas advertencias como sea posible en un tiempo (el proyecto de compilación se usa en CruiseControl.NET)
Puede ser, la solución es crear mi propio registrador que almacenaría el indicador de advertencias dentro, pero no puedo encontrar si hay una manera de leer este indicador al final de compilación?
P.S. No hay problema en dejar de construir inmediatamente después de recibir una advertencia (la tarea personalizada procesa la salida del compilador Delphi y/warnaserror se puede usar para C#), pero el comportamiento deseado es "compilar todo, recopilar todas las advertencias; para informar sobre todas las advertencias, no solo sobre la primera.
P.P.S. Por lo que realmente no necesito un número de advertencias, sino solo una bandera de su presencia, decidí simplificar el mecanismo de señalización, y usar Mutex trivial en lugar de memoria compartida. Es el código de abajo:
using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using System.Threading;
namespace Intrahealth.Build.WarningLogger
{
public sealed class WarningLoggerCheck : Task
{
public override bool Execute()
{
Log.LogMessage("WarningLoggerCheck:" + mutexName + "...");
result = false;
Mutex m = null;
try
{
m = Mutex.OpenExisting(mutexName);
}
catch (WaitHandleCannotBeOpenedException)
{
result = true;
}
catch (Exception)
{
}
if (result)
Log.LogMessage("WarningLoggerCheck PASSED");
else
Log.LogError("Build log contains warnings. Build is FAILED");
return result;
}
private bool result = true;
[Output]
public bool Result
{
get { return result; }
}
private string mutexName = "WarningLoggerMutex";
public string MutexName
{
get { return mutexName; }
set { mutexName = value ?? "WarningLoggerMutex"; }
}
}
public class WarningLogger : Logger
{
internal static int warningsCount = 0;
private string mutexName = String.Empty;
private Mutex mutex = null;
public override void Initialize(IEventSource eventSource)
{
eventSource.WarningRaised += new BuildWarningEventHandler(eventSource_WarningRaised);
}
private void SetMutex()
{
if (mutexName == String.Empty)
{
mutexName = "WarningLoggerMutex";
if (this.Parameters != null && this.Parameters != String.Empty)
{
mutexName = this.Parameters;
}
}
mutex = new Mutex(false, mutexName);
}
void eventSource_WarningRaised(object sender, BuildWarningEventArgs e)
{
if (e.Message != null && e.Message.Contains("MSB3146"))
return;
if (e.Code != null && e.Code.Equals("MSB3146"))
return;
if (warningsCount == 0)
SetMutex();
warningsCount++;
}
}
}
Intenté usar casi lo mismo, pero utilicé el miembro estático en la subclase Tarea para recopilar el recuento de advertencias (y no funcionó). Gracias por la idea sobre la memoria compartida. – Abelevich