【问题标题】:How can I treat MSB3245 (could not resolve reference) warning as an error?如何将 MSB3245(无法解析参考)警告视为错误?
【发布时间】:2013-07-03 22:25:26
【问题描述】:

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

但是,到目前为止,我所看到的只是 /p:WarningsAsErrors 只接受 csc 警告和错误。我尝试只是删除MSB 并在谷歌上搜索可能会在那里工作的号码,但没有运气。

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

【问题讨论】:

    标签: msbuild


    【解决方案1】:

    最近我需要类似的东西(对某些日志事件采取行动),但我找不到一个干净的解决方案,主要是因为我还没有弄清楚如何在 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
    

    edit 我只是再次需要它,但再也找不到原始 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>
    

    更新回应 cmets:今天再次尝试我不确定原始代码是否真的有效(好吧,它适用于显示的示例消息,但不适用于实际的警告 MSB3245),因为它仅挂钩消息事件,而 ResolveAssemblyReference 发出实际的警告事件,而且警告编号通常不包含在消息中。不过,这可以解决问题:

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

    【讨论】:

    • 有没有办法将此流程添加到解决方案级别而不是项目级别?
    • 基本上你会在一个通用文件中定义这个逻辑,然后在每个项目中导入该文件。不确定在解决方案的基础上自动执行此操作的最佳方法,可能是这样的:stackoverflow.com/questions/18249027/…dotnet.geir-sorensen.net/2010/04/msbuild-custom-targets.html
    • @stijn 我正在使用此代码,并使其与您的示例一起使用(我人为地发送了一条包含 MSB3245 的消息)。但是,当我真正运行它时,没有这样的消息进来。我正在记录(到一个文件)这个记录器收到的每条消息,并且没有有趣的消息进来(带有警告等)。我还尝试连接 eventSource.AnyEventRaised 和 eventSource.WarningRaised,但它们也没有我想要找到的警告。看起来行为已经改变了。
    • @fastmultiplication 你用的是什么版本?
    • @stijn 我的 msbuild 版本是 15.5.180.51428
    【解决方案2】:

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

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

    ,不完全正确。如果缺少的引用是 WPF 主题,您将收到 run-time 错误 (System.IO.FileNotFoundException)。

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

    CSC : 警告 CS1691: 'MSB3245' 不是有效的警告编号

    【讨论】:

      猜你喜欢
      • 2019-04-14
      • 2020-07-25
      • 2016-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-04
      相关资源
      最近更新 更多