Msbuild 如何将MSB3245(无法解析引用)警告视为错误?

Msbuild 如何将MSB3245(无法解析引用)警告视为错误?,msbuild,Msbuild,我的问题基于,但我想做相反的事情:告诉msbuild将警告视为错误,而不是禁止特定的msbuild警告 然而,到目前为止,我看到的都是/p:WarningsAsErrors只接收csc警告和错误。我试着放下MSB,用谷歌搜索哪个数字可以在那里工作,但没有成功 是否有任何方法可以将msbuild(命令行)发出的“未找到程序集引用”警告视为错误?最近,我需要类似的东西(对某些日志事件执行操作),但我找不到干净的解决方案,主要是因为我还没有弄清楚如何以编程方式访问msbuild进程中的记录器。但我确实

我的问题基于,但我想做相反的事情:告诉msbuild将警告视为错误,而不是禁止特定的msbuild警告

然而,到目前为止,我看到的都是
/p:WarningsAsErrors
只接收csc警告和错误。我试着放下MSB,用谷歌搜索哪个数字可以在那里工作,但没有成功


是否有任何方法可以将msbuild(命令行)发出的“未找到程序集引用”警告视为错误?

最近,我需要类似的东西(对某些日志事件执行操作),但我找不到干净的解决方案,主要是因为我还没有弄清楚如何以编程方式访问msbuild进程中的记录器。但我确实想到了这个,根据你的问题,原则是:

  • 安装自定义记录器扫描警告
  • 建造
  • 如果出现警告,请设置静态标志
  • 让自定义任务检查该标志,如果该标志处于启用状态,则引发错误
听起来可能很难,但代码很简单:

using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace Foo
{
  public static class Common
  {
    public static bool errorsOccurred = false;
  }

  public class ScanLogger : Logger
  {
    public override void Initialize( IEventSource eventSource )
    {
      eventSource.MessageRaised += ( s, e ) =>
        Common.errorsOccurred |= e.Message.Contains( "MSB3245" );
    }
  }

  public class CheckErrors : Task
  {
    public override bool Execute()
    {
      if( Common.errorsOccurred == false )
        return true;
      Log.LogError( "errorsOccurred = true" );
      return false;
    }
  }
}
下面是使用它的msbuild脚本示例:

<UsingTask TaskName="Foo.CheckErrors" AssemblyFile="Foo.dll"/>

<Target Name="MyBuild">
  <Message Text="MSB3245"/> <!-- simulate the build warning -->
  <Foo.CheckErrors /> <!-- this will trigger an error -->
</Target>
编辑我只是再次需要它,但再也找不到原始的dll或项目文件等-我认为只在git中存储代码和最简单的构建指令,并在需要时动态构建它可能更干净。因此,基本上将上述代码存储在customlogger.cs文件中,然后在构建过程中的某个地方,在使用自定义记录器有效地调用msbuild之前,使用

<Target Name="BuildCustomLoggerDll">
  <Csc Sources="$(MSBuildThisFileDirectory)customlogger.cs"
       References="System.dll;mscorlib.dll;Microsoft.Build.Framework.dll;Microsoft.Build.Utilities.v4.0.dll"
       TargetType="Library" OutputAssembly="$(MSBuildThisFileDirectory)CustomLogger.dll"/>
</Target>

与此警告关联的消息似乎不是警告:

如果您的代码需要此引用,则可能需要编译 错误

,不太正确。如果缺少的引用是一个WPF主题,那么您将得到一个运行时错误(System.IO.FileNotFoundException)

另外,如果您专门查找MSB3245,您将得到:

CSC:警告CS1691:“MSB3245”不是有效的警告号


有没有办法将此流程添加到解决方案级别而不是项目级别?基本上,您应该在一个公共文件中定义此逻辑,然后在每个项目中导入该文件。不过,我不确定在解决方案的基础上自动执行此操作的最佳方法,例如:或@stijn我正在使用此代码,并使其与您的示例一起工作(在您的示例中,我人为地发送了一条包含MSB3245的消息)。然而,当我真的运行它时,没有这样的消息出现。我正在将此记录器接收到的每条消息(记录到一个文件中),没有任何有趣的消息(带有警告等)。我还尝试连接到eventSource.AnyEventRaised和eventSource.warnigrased,但它们都没有我试图找到的警告。行为似乎已更改。@您使用的是什么版本?@stijn我的msbuild版本是15.5.180.51428
<Target Name="BuildCustomLoggerDll">
  <Csc Sources="$(MSBuildThisFileDirectory)customlogger.cs"
       References="System.dll;mscorlib.dll;Microsoft.Build.Framework.dll;Microsoft.Build.Utilities.v4.0.dll"
       TargetType="Library" OutputAssembly="$(MSBuildThisFileDirectory)CustomLogger.dll"/>
</Target>
public class ScanLogger : Logger
{
  public override void Initialize( IEventSource eventSource )
  {
    eventSource.WarningRaised += ( s, e ) => Common.errorsOccurred |= e.Code == "MSB3245";
  }
}