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

时间:2013-07-05 18:55:54

标签: msbuild

我的问题基于another one,但我想做相反的:告诉msbuild将警告视为错误而不是抑制特定的msbuild警告。

但是,到目前为止我所看到的只是/p:WarningsAsErrors只接受csc警告和错误。我试着放弃MSB并用谷歌搜索可以在那里工作的数字,但没有运气。

有没有办法将msbuild(命令行)中的“未找到程序集引用”警告视为错误?

2 个答案:

答案 0 :(得分:9)

最近我需要类似的东西(对某些日志事件起作用),但我找不到一个干净的解决方案,主要是因为我还没想出如何以编程方式访问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>

你这样调用它:

msbuild /logger:Foo.dll my.proj

编辑我再次需要这个但是找不到原始的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>

更新在回复评论时:今天再试一次我不确定原始代码是否真的有效(好吧,它确实显示的是示例消息但不是实际警告MSB3245),因为它仅挂钩消息事件,而ResolveAssemblyReference发出实际的警告事件,而且警告号通常不包含在消息中。尽管如此:

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

答案 1 :(得分:1)

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

  

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

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

顺便说一句,如果您专门寻找MSB3245,您将获得:

  CSC:警告CS1691:&#39; MSB3245&#39;不是有效的警告编号