我已经将StyleCop.Analyzers NuGet包添加到我的项目中(最新的稳定版本,1.1.118)。这包含了一些关于确保文件头的存在和正确的分析规则。我的项目还有以下stylecop.json文件,将Build属性设置为"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
{
}
}
VisualStudio2019很有帮助地建议我可以在具有如下属性的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将属性灰化,因为Scope
和Target
没有解析任何内容,但是当我完成编辑时,属性不再是灰色的,这使我认为我已经正确地指定了Scope
和Target
。然而,这并不会导致警告被抑制。
Visual还建议我可以这样抑制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中偶然发现了一个bug吗?
更新1月9日
经过进一步的思考,我怀疑我之所以不能使用SuppressMessage
来抑制警告,是因为警告是针对文件而不是针对类引发的,并且我指定的Target
指向类而不是文件。
对Target
参数的不同值进行一些实验似乎表明,只有当Target
指向不存在的东西时,Visual才会删除该属性,但当目标上没有这样的警告时,则不是这样。我怀疑可能不可能针对一个文件而不是一个类,但是我还没有找到任何关于如何构建Target
的指导。
这个GitHub问题似乎涵盖了我的用例,因此我没有创建一个新的用例:https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/2733
发布于 2022-01-08 17:42:12
您基于type
的全局支持看起来是正确的,但我得到的结果相同,即它们没有被捕获,尽管抑制规则本身是突出显示/识别的。
这看起来确实是一个bug的候选。
作为与预期结果的替代/解决方案,您可以在.editorconfig
文件中配置忽略规则。
若要仅针对该SomeoneElsesClass
类,请在一节中指定目标文件名-此处为:[{SomeoneElsesClass.cs}]
。
如果需要,还可以使用更详细的路径,例如[{Folder/SomeoneElsesClass.cs}]
[{SomeoneElsesClass.cs}]
dotnet_diagnostic.SA1636.severity = none
dotnet_diagnostic.SA1641.severity = none
https://stackoverflow.com/questions/70633730
复制相似问题