我的问题是基于另一个问题,但我想做相反的事情:告诉 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>
你像这样调用它:
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";
}
}
与此警告相关的消息似乎不是警告:
如果您的代码需要此引用,您可能会遇到编译错误
, 不太正确。如果缺少的引用是 WPF 主题,您将收到运行时错误 (System.IO.FileNotFoundException)。
顺便说一句,如果您专门寻找 MSB3245,您将获得:
CSC:警告 CS1691:“MSB3245”不是有效的警告编号