首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在重用其他代码时修复/抑制SA1636和SA1641?

如何在重用其他代码时修复/抑制SA1636和SA1641?
EN

Stack Overflow用户
提问于 2022-01-08 15:19:23
回答 1查看 367关注 0票数 3

我已经将StyleCop.Analyzers NuGet包添加到我的项目中(最新的稳定版本,1.1.118)。这包含了一些关于确保文件头的存在和正确的分析规则。我的项目还有以下stylecop.json文件,将Build属性设置为"C#分析器附加文件“。

代码语言:javascript
运行
复制
{
  "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json",
  "settings": {
    "documentationRules": {
      "companyName": "Me"
    }
  }
}

如果我将以下类添加到项目中,则会引发一个警告"SA1636:文件标题版权文本应与设置中的版权文本匹配“。

代码语言:javascript
运行
复制
// <copyright file="MyClass.cs" company="Me">
// Copyright (c) Me. All rights reserved. Some extra text to intentionally cause SA1636.
// </copyright>

namespace StackOverflowSA1636
{
    /// <summary>
    /// A class that I wrote.
    /// </summary>
    public class MyClass
    {
    }
}

如果我从文件头中删除Some extra text to intentionally cause SA1636.,那么警告就会消失。目前为止一切都很好。

但是,如果我想使用其他人编写的类,或者是原样的类,或者是我所做的任何更改,该怎么办?我想把他们的代码正确地归功于他们。下面的类将引发警告SA1636,以及"SA1641:文件头公司名称应与设置中的公司名称匹配“。

代码语言:javascript
运行
复制
// <copyright file="SomeoneElsesClass.cs" company="Me, Someone Else">
// Copyright (c) Me, Someone Else. All rights reserved.
// </copyright>

namespace StackOverflowSA1636
{
    /// <summary>
    /// A class written by someone else which I've adapted for my needs.
    /// </summary>
    public class SomeoneElsesClass
    {
    }
}

VisualStudio2019很有帮助地建议我可以在具有如下属性的GlobalSuppressions.cs文件中禁用这些警告:

代码语言:javascript
运行
复制
using System.Diagnostics.CodeAnalysis;

[assembly: SuppressMessage(
    "StyleCop.CSharp.DocumentationRules",
    "SA1636:File header copyright text should match",
    Justification = "Someone else wrote the original version of this class",
    Scope = "namespace",
    Target = "~N:StackOverflowSA1636")]

[assembly: SuppressMessage(
    "StyleCop.CSharp.DocumentationRules",
    "SA1641:File header company name text should match",
    Justification = "Someone else wrote the original version of this class",
    Scope = "namespace",
    Target = "~N:StackOverflowSA1636")]

这确实抑制了警告,但是对于整个命名空间,这不是我想要的。我只想为了一节课压制他们。我试着把它们换成这个:

代码语言:javascript
运行
复制
[assembly: SuppressMessage(
    "StyleCop.CSharp.DocumentationRules",
    "SA1636:File header copyright text should match",
    Justification = "Someone else wrote the original version of this class",
    Scope = "type",
    Target = "~T:StackOverflowSA1636.SomeoneElsesClass")]

[assembly: SuppressMessage(
    "StyleCop.CSharp.DocumentationRules",
    "SA1641:File header company name text should match",
    Justification = "Someone else wrote the original version of this class",
    Scope = "type",
    Target = "~T:StackOverflowSA1636.SomeoneElsesClass")]

在进行此编辑时,Visual将属性灰化,因为ScopeTarget没有解析任何内容,但是当我完成编辑时,属性不再是灰色的,这使我认为我已经正确地指定了ScopeTarget。然而,这并不会导致警告被抑制。

Visual还建议我可以这样抑制SA1636:

代码语言:javascript
运行
复制
#pragma warning disable SA1636 // File header copyright text should match
// <copyright file="SomeoneElsesClass.cs" company="Me, Someone Else">
// Copyright (c) Me, Someone Else. All rights reserved.
// </copyright>

namespace StackOverflowSA1636
#pragma warning restore SA1636 // File header copyright text should match
{
    /// <summary>
    /// A class written by someone else which I've adapted for my needs.
    /// </summary>
    public class SomeoneElsesClass
    {
    }
}

这确实压制了警告,但提出了三个新的警告:

"SA1633:文件头丢失或不在文件顶部“(因为文件的第一行是#pragma而不是文件头)

"SA1512:单行注释不应该后面跟着空行“(大概是因为文件头不再被识别为文件头的一部分,因为它不在文件的顶部,所以它被视为常规注释)。

"SA1515:单行注释前应加上空行“(与SA1512相同的原因)

有一种解决方案不涉及压制任何东西,只需按StyleCop想要的方式保留文件头,然后对原始作者进行注释,或者包含原始代码中的任何版权/许可声明。这让人产生误解,因为文件头实际上声称我是唯一的作者,而我不是,但是有什么更好的方法既满足StyleCop又正确地信任原始作者吗?

我可以对stylecop.json文件做些什么来改变文件头的验证方式吗?

我在StyleCop.Analyzers中偶然发现了一个bug吗?

更新1月9日

经过进一步的思考,我怀疑我之所以不能使用SuppressMessage来抑制警告,是因为警告是针对文件而不是针对类引发的,并且我指定的Target指向类而不是文件。

Target参数的不同值进行一些实验似乎表明,只有当Target指向不存在的东西时,Visual才会删除该属性,但当目标上没有这样的警告时,则不是这样。我怀疑可能不可能针对一个文件而不是一个类,但是我还没有找到任何关于如何构建Target的指导。

这个GitHub问题似乎涵盖了我的用例,因此我没有创建一个新的用例:https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/2733

EN

回答 1

Stack Overflow用户

发布于 2022-01-08 17:42:12

您基于type的全局支持看起来是正确的,但我得到的结果相同,即它们没有被捕获,尽管抑制规则本身是突出显示/识别的。

这看起来确实是一个bug的候选。

作为与预期结果的替代/解决方案,您可以在.editorconfig文件中配置忽略规则。

若要仅针对该SomeoneElsesClass类,请在一节中指定目标文件名-此处为:[{SomeoneElsesClass.cs}]

如果需要,还可以使用更详细的路径,例如[{Folder/SomeoneElsesClass.cs}]

代码语言:javascript
运行
复制
[{SomeoneElsesClass.cs}]
dotnet_diagnostic.SA1636.severity = none
dotnet_diagnostic.SA1641.severity = none
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70633730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档