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