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

2023-11-26

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

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

有什么方法可以将 msbuild (命令行)中的“未找到程序集引用”警告视为错误吗?


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

  • 安装自定义记录器扫描警告
  • build
  • 如果发生警告则设置静态标志
  • 让自定义任务检查该标志并在其打开时引发错误

听起来可能很难,但代码很简单:

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>

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

public class ScanLogger : Logger
{
  public override void Initialize( IEventSource eventSource )
  {
    eventSource.WarningRaised += ( s, e ) => Common.errorsOccurred |= e.Code == "MSB3245";
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 MSB3245(无法解析引用)警告视为错误? 的相关文章

随机推荐