重用别人的代码时如何修复/抑制SA1636和SA1641?



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

{
"$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json",
"settings": {
"documentationRules": {
"companyName": "Me"
}
}
}

如果我将下面的类添加到项目中,它将引发一个警告"SA1636:文件头版权文本应当与来自设置"的版权文本相匹配;。

// <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:文件头公司名称应该与来自设置"的公司名称相匹配;。

// <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
{
}
}

Visual Studio 2019建议我可以在具有以下属性的GlobalSuppressions.cs文件中抑制这些警告:

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")]

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

[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 Studio将属性灰显,因为ScopeTarget没有解析为任何内容,但当我完成编辑时,属性不再灰显,这使我认为我已正确指定了ScopeTarget。然而,这并不会导致警告被抑制。

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

#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中偶然发现了一个错误?


更新1月9日

经过进一步思考,我怀疑我无法使用SuppressMessage抑制警告的原因是,警告是针对文件而非类发出的,并且我指定的Target指向类而非文件。

Target参数的不同值进行一些实验似乎表明,只有当Target指向不存在的东西时,Visual Studio才会使该属性变灰,而当目标处没有要抑制的警告时,则不会。我怀疑可能不可能以文件为目标而不是以类为目标,但我并不喜欢找到任何关于如何构建Target的指导。

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

基于type的全局抑制看起来是正确的,但我得到的结果是,尽管抑制规则本身被突出显示/识别,但这些抑制没有被提取
这看起来确实是一个bug的候选者。


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

要仅针对该SomeoneElsesClass类,请在节中指定目标文件名-此处为:[{SomeoneElsesClass.cs}]
如果需要,您还可以使用更详细的路径,例如[{Folder/SomeoneElsesClass.cs}]

[{SomeoneElsesClass.cs}]
dotnet_diagnostic.SA1636.severity = none
dotnet_diagnostic.SA1641.severity = none

最新更新