GitLab CI(Nuke构建)因警告被视为错误失败,如何忽略?
问题
我使用Nuke搭建了一个用于项目构建的GitLab CI流水线。在构建阶段,项目出现了一些我希望忽略的警告,但CI将这些警告视为错误,导致流水线执行失败。我想抑制这种将警告转为错误的行为,请问该如何操作?
构建日志
2:54:47 [信息] > /usr/bin/dotnet build Contracts/Hlc.Contracts.Tools/Hlc.Contracts.Tools.csproj --configuration Release 12:54:47 [调试] MSBuild版本 17.9.8+b34f75857 for .NET 12:54:47 [调试] 正在确定要还原的项目... 12:54:48 [调试] 所有项目均已最新,无需还原。 12:54:50 [调试] Hlc.Contracts.Core -> /builds/hlc/core/Contracts/Hlc.Contracts.Core/bin/Release/net6.0/Hlc.Contracts.Core.dll 12:54:50 [错误] /builds/hlc/core/Contracts/Hlc.Contracts.Tools/Tcp/Client/AsyncTcpClient.cs(34,40): 错误 CS8632: 可为空引用类型的注释仅应在 '#nullable' 注释上下文中的代码中使用。[/builds/hlc/core/Contracts/Hlc.Contracts.Tools/Hlc.Contracts.Tools.csproj] 12:54:50 [错误] /builds/hlc/core/Contracts/Hlc.Contracts.Tools/Tcp/LlcTcp/LlcTcpClientDev.cs(91,23): 错误 CS1998: 此异步方法缺少 'await' 运算符,将同步运行。请考虑使用 'await' 运算符等待非阻塞 API 调用,或使用 'await Task.Run(...)' 在后台线程上执行 CPU 密集型工作。[/builds/hlc/core/Contracts/Hlc.Contracts.Tools/Hlc.Contracts.Tools.csproj] 12:54:50 [错误] /builds/hlc/core/Contracts/Hlc.Contracts.Tools/Tcp/LlcTcp/LlcTcpClientDev.cs(44,43): 错误 CS8618: 退出构造函数时,不可为 null 的字段 '_handler' 必须包含非 null 值。请考虑将该字段声明为可为 null。[/builds/hlc/core/Contracts/Hlc.Contracts.Tools/Hlc.Contracts.Tools.csproj] 12:54:50 [错误] /builds/hlc/core/Contracts/Hlc.Contracts.Tools/Tcp/LlcTcp/LlcTcpClientDev.cs(62,19): 错误 CS8618: 退出构造函数时,不可为 null 的属性 'Name' 必须包含非 null 值。请考虑将该属性声明为可为 null。[/builds/hlc/core/Contracts/Hlc.Contracts.Tools/Hlc.Contracts.Tools.csproj] 12:54:50 [错误] /builds/hlc/core/Contracts/Hlc.Contracts.Tools/Tcp/LlcTcp/LlcTcpClientDev.cs(63,23): 错误 CS8618: 退出构造函数时,不可为 null 的属性 'RemoteEndpoint' 必须包含非 null 值。请考虑将该属性声明为可为 null。[/builds/hlc/core/Contracts/Hlc.Contracts.Tools/Hlc.Contracts.Tools.csproj] 12:54:50 [错误] /builds/hlc/core/Contracts/Hlc.Contracts.Tools/Tcp/LlcTcp/LlcTcpClientDev.cs(44,43): 错误 CS0649: 字段 'LlcTcpClient._handler' 从未被赋值,将始终具有其默认值 null[/builds/hlc/core/Contracts/Hlc.Contracts.Tools/Hlc.Contracts.Tools.csproj] 12:54:50 [错误] /builds/hlc/core/Contracts/Hlc.Contracts.Tools/Tcp/LlcTcp/LlcTcpClientDev.cs(58,17): 错误 CS0414: 字段 'LlcTcpClient._reconnectionAttempts' 已被赋值但从未使用[/builds/hlc/core/Contracts/Hlc.Contracts.Tools/Hlc.Contracts.Tools.csproj] 12:54:50 [调试] 12:54:50 [调试] 构建失败。 12:54:50 [调试] 12:54:50 [错误] /builds/hlc/core/Contracts/Hlc.Contracts.Tools/Tcp/Client/AsyncTcpClient.cs(34,40): 错误 CS8632: 可为空引用类型的注释仅应在 '#nullable' 注释上下文中的代码中使用。[/builds/hlc/core/Contracts/Hlc.Contracts.Tools/Hlc.Contracts.Tools.csproj] 12:54:50 [错误] /builds/hlc/core/Contracts/Hlc.Contracts.Tools/Tcp/LlcTcp/LlcTcpClientDev.cs(91,23): 错误 CS1998: 此异步方法缺少 'await' 运算符,将同步运行。请考虑使用 'await' 运算符等待非阻塞 API 调用,或使用 'await Task.Run(...)' 在后台线程上执行 CPU 密集型工作。[/builds/hlc/core/Contracts/Hlc.Contracts.Tools/Hlc.Contracts.Tools.csproj] 12:54:50 [错误] /builds/hlc/core/Contracts/Hlc.Contracts.Tools/Tcp/LlcTcp/LlcTcpClientDev.cs(44,43): 错误 CS8618: 退出构造函数时,不可为 null 的字段 '_handler' 必须包含非 null 值。请考虑将该字段声明为可为 null。[/builds/hlc/core/Contracts/Hlc.Contracts.Tools/Hlc.Contracts.Tools.csproj] 12:54:50 [错误] /builds/hlc/core/Contracts/Hlc.Contracts.Tools/Tcp/LlcTcp/LlcTcpClientDev.cs(62,19): 错误 CS8618: 退出构造函数时,不可为 null 的属性 'Name' 必须包含非 null 值。请考虑将该属性声明为可为 null。[/builds/hlc/core/Contracts/Hlc.Contracts.Tools/Hlc.Contracts.Tools.csproj] 12:54:50 [错误] /builds/hlc/core/Contracts/Hlc.Contracts.Tools/Tcp/LlcTcp/LlcTcpClientDev.cs(63,23): 错误 CS8618: 退出构造函数时,不可为 null 的属性 'RemoteEndpoint' 必须包含非 null 值。请考虑将该属性声明为可为 null。[/builds/hlc/core/Contracts/Hlc.Contracts.Tools/Hlc.Contracts.Tools.csproj] 12:54:50 [错误] /builds/hlc/core/Contracts/Hlc.Contracts.Tools/Tcp/LlcTcp/LlcTcpClientDev.cs(44,43): 错误 CS0649: 字段 'LlcTcpClient._handler' 从未被赋值,将始终具有其默认值 null[/builds/hlc/core/Contracts/Hlc.Contracts.Tools/Hlc.Contracts.Tools.csproj] 12:54:50 [错误] /builds/hlc/core/Contracts/Hlc.Contracts.Tools/Tcp/LlcTcp/LlcTcpClientDev.cs(58,17): 错误 CS0414: 字段 'LlcTcpClient._reconnectionAttempts' 已被赋值但从未使用[/builds/hlc/core/Contracts/Hlc.Contracts.Tools/Hlc.Contracts.Tools.csproj] 12:54:50 [调试] 0 警告 12:54:50 [调试] 7 错误 12:54:50 [调试] 12:54:50 [调试] 已用时间 00:00:03.38 12:54:50 [错误] 目标 Compile 引发异常
解决方案
针对你的场景,有三种常用方法可以抑制警告转错误的行为,按需选择:
1. 修改DotNet Build命令参数
直接在dotnet build命令中添加参数,要么全局关闭警告转错误,要么忽略指定的错误码:
- 全局关闭警告转错误:
dotnet build Contracts/Hlc.Contracts.Tools/Hlc.Contracts.Tools.csproj --configuration Release /warnaserror:false - 仅忽略指定的警告码(对应日志中的CS8632、CS1998等):
dotnet build Contracts/Hlc.Contracts.Tools/Hlc.Contracts.Tools.csproj --configuration Release --no-warn CS8632,CS1998,CS8618,CS0649,CS0414
2. 在Nuke构建脚本中配置
如果是用Nuke的C#构建脚本(Build.cs),可以在Build目标中配置DotNetBuildSettings:
Target Build => _ => _ .DependsOn(Restore) .Executes(() => { DotNetBuild(s => s .SetProjectFile("Contracts/Hlc.Contracts.Tools/Hlc.Contracts.Tools.csproj") .SetConfiguration(Configuration.Release) // 全局关闭警告转错误 .SetWarnAsError(false) // 或者仅忽略指定警告码 .SetNoWarn("CS8632", "CS1998", "CS8618", "CS0649", "CS0414") ); });
3. 修改项目文件(.csproj)
直接在目标项目的.csproj文件中添加配置,作用范围仅限该项目:
- 全局关闭警告转错误:
<PropertyGroup> <TreatWarningsAsError>false</TreatWarningsAsError> </PropertyGroup> - 仅忽略指定警告码:
<PropertyGroup> <NoWarn>CS8632;CS1998;CS8618;CS0649;CS0414</NoWarn> </PropertyGroup>
内容的提问来源于stack exchange,提问作者Alexandr Malkov
相关产品推荐
相关产品推荐

