在VS Code中禁用特定的编译器警告

33
我想知道如何在VS Code中针对整个项目禁止特定编译警告。
我看到了这篇问题:Is it possible to disable specific compiler warnings? 但它是针对Visual Studio而不是Visual Studio Code的。
以下是在上述问题中推荐的答案:
1. Solution Explorer > View > Properties > Build > Suppress Warnings

2. #pragma warning disable warning-list 对于第1点:我无法在VS Code中找到“Solution Explorer”。
对于第2点:仅当我将它包含在每个脚本的顶部时才起作用。我需要一种方法来针对整个项目进行设置。
更新: 我尝试在我的.csproj文件中使用<noWarn>01699,8019</noWarn>,但没有效果。 检查最新更改后,我注意到它已恢复为<noWarn>0169</noWarn>。然后我意识到我所需要的是 <noWarn>0169;8019</noWarn>。将逗号换成分号解决了问题。
结果发现上述解决方案并没有起作用。一旦我重启了VS Code,所有的警告都回来了。也许我需要的错误代码不是8019,尽管在#pragma语句中作为错误代码可以工作。在<noWarn>结束处使用的代码与在#pragma语句末尾使用的代码不同吗?对于那些建议切换到VS社区版本的人来说,这不是重点。我正在使用VS Code作为文本编辑器Unity Editor一起使用。我要找出需要更改哪个文件以及需要进行哪些更改才能将类似#pragma warning disable 8019的语句应用于整个项目。

VS Code没有解决方案资源管理器。如果有的话,我找不到它。我会澄清这一点。 - Patrick vD
从链接中的答案中得知:在“解决方案资源管理器”中,选择您想要抑制警告的项目。编辑您的项目属性(在您的解决方案下)。 - Kory Gill
在 VS Code 中,我在哪里可以找到解决方案资源管理器? - Patrick vD
1
现在您已经明确表示您正在使用的是Visual Studio Code而不是Visual Studio,不幸的是,我无法为您提供帮助,因为我对此不熟悉。也许一个好的替代方案是Visual Studio Community Edition,它是免费且更强大的。 - Kory Gill
我正在使用Unity,并希望使用VS Code代替MonoDevelop。 - Patrick vD
显示剩余2条评论
3个回答

34

我成功让它工作了。我的解决方案看起来像这样:

<PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <RuntimeFrameworkVersion>2.1.1</RuntimeFrameworkVersion>
    <NoWarn>0169;8019</NoWarn>
</PropertyGroup>

<NoWarn> 使用 PascalCase 而不是 camelCase,且该元素嵌套在 <PropertyGroup> 中。


在以下场景中对我完美运作:
  • Linux(基于Ubuntu)
  • VS Code(1.79)
  • .NET 7.0.x
  • C# Dev Kit(扩展)
注意:在<NoWarn></NoWarn>标签内也可以使用整个代码,例如IDE0090
- ryuzakyl

1

skmikelson的回答漏掉了一些内容,那就是“在哪里放置XML代码?” 这是一个更好的回答(至少它会帮助我)。

  1. 退出Visual Studio。

  2. 备份您的项目文件。 如果您的项目名为“HelloWorld”,并且使用VB,则项目文件将为“HelloWorld.vbproj”。如果您使用C#,则项目文件将为“HelloWorld.csproj”。

  3. 使用记事本手动编辑项目文件。不要使用Word或除记事本之外的任何其他编辑器。记事本不会重新格式化您的文件或添加额外的垃圾文件来损坏您的文件。

  4. 搜索字符串“NoWarn”。此标记应在PropertyGroup标记内。

  5. 如果错误是IDE0060,则编辑XML使其类似于以下内容:

<NoWarn>0060
</NoWarn>

请注意,我没有包含“IDE”这个字母,只有数字“0060”。
如果您有多个警告要忽略,可以用分号将代码分开,像这样:
<NoWarn>0060;0061
</NoWarn>
  1. 保存项目文件,退出Notepad,然后在Visual Studio中重新加载您的项目。

  2. 如果这不起作用,请检查您的项目文件--可能有多个NoWarn标记的实例,您可能需要更改所有实例。


现在轮到你解释在哪里找到这个项目文件了。 - gk_2000
@gk_2000 你可以使用Windows资源管理器或VS Code来查找项目文件,而不是使用VS Pro。Pro会在解决方案视图中隐藏实际的项目文件,并提供属性编辑器而非直接访问内容。 - Ryan Grange
我指的是使用Windows资源管理器导航到哪个位置?我应该搜索什么名称? - gk_2000

1

感谢Unity论坛用户rakkarage发布的代码,我最终通过在我的Unity项目中创建以下编辑器脚本来解决了这个问题:

using System.IO;
using System.Text.RegularExpressions;
using UnityEngine;
using UnityEditor;

[InitializeOnLoad]
class FixCSProjs : AssetPostprocessor
{
    private static void OnGeneratedCSProjectFiles() {
        Debug.Log("Fixing csproj files...");
        var dir = Directory.GetCurrentDirectory();
        var files = Directory.GetFiles(dir, "*.csproj");
        
        foreach (var file in files) {
            FixProject(file);
        }
    }
    
    static bool FixProject(string file) {
        var text = File.ReadAllText(file);
        var find = "<NoWarn>([0-9;]+)<\\/NoWarn>";
        var replace = "<NoWarn>$1;3003;3009</NoWarn>";
        
        if (Regex.IsMatch(text, find)) {
            text = Regex.Replace(text, find, replace);
            File.WriteAllText(file, text);
            return true;
            
        } else {
            return false;
        }
    }
}

每次Unity自动生成csproj文件时,这会向每个文件的NoWarn属性添加额外的警告代码。这样做的重要优点是不需要手动编辑由Unity自动生成的文件,因此更加健壮,适合包含在诸如git之类的代码库中。
在我这里,我禁用了3003和3009警告(CLS兼容性警告),但只需用任何分号分隔的警告代码替换我的代码中的3003;3009就可以解决问题。
我还想说,这是一个可怕的解决方案,我真的希望有更好、更清洁的方法来完成这个任务。
编辑:在最新版本的Unity中,这个解决方案不再起作用,因为它不再调用OnGeneratedCSProjectFiles()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接