Как подавить дефекты жандарма? - PullRequest
7 голосов
/ 14 апреля 2010

Можно ли подавить сообщение о конкретном дефекте жандарма? Я хотел бы сделать это в исходном коде с флагом или что-то вроде этого.

Ответы [ 3 ]

5 голосов
/ 10 мая 2011

Как уже отметил Пупу, версия 2.10 поддерживает атрибут [SuppressMessage].

Например, чтобы подавить правило AvoidNonAlphanumericIdentifierRule, сделайте следующее:

[SuppressMessage("Gendarme.Rules.Naming", "AvoidNonAlphanumericIdentifierRule")]
protected void Application_Start()
{
     ...
}

Обратите внимание, что вам нужно указать имя сборки, где находится правило ... в этом случае AvoidNonAlphanumericIdentifierRule находится в Gendarme.Rules.Naming.dll. Полный список правил и названия их сборок: здесь .

1 голос
/ 11 ноября 2010

Если вы используете консоль, вы можете использовать файл дефектов (вне источника) для устранения любого дефекта в методе, типе или сборке.

Новый Gendarme 2.8 имеет базовую (с неполным чтением и с ошибками) поддержку атрибута [SuppressMessage] (аналогично fxcop). Ожидайте, что эта функция будет работать должным образом после выхода 2.10.

0 голосов
/ 29 декабря 2010

Насколько я вижу, нет возможности включить [SuppressMessage] в Жандарме (в 2.8). Я взял последний источник с GitHub, потому что он не работал, как описано.

В коде есть SupressMessageEngine, и есть тесты, выполняющие его через ручное переопределение Runner.Engines.Subscribe. Но [EngineDependency (typeof (SuppressMessageEngine))]] не применяется ко всем скомпилированным правилам, так как он подписывается, когда Gendarme фактически выполняется.

Я также посмотрел на источник, чтобы найти способ всегда подписываться на конкретный движок через config - но его нет.

Я могу ошибаться, но похоже, что они забыли вернуться и применить соответствующие атрибуты EngineDependency.

Единственный «обходной путь», о котором я могу подумать, - это написать собственное правило, которое при вызове добавляет подписку SuppressMessageEngine и больше ничего не делает. Да, но это должно работать на основе того, что я видел в их коде.

К вашему сведению - только что реализовал это. Вам необходимо создать собственное пользовательское правило, импортировать Mono.Cecil и Gendarme.Framework и целевой .NET Framework 3.5

using Gendarme.Framework;
using Gendarme.Framework.Engines;

namespace MyRules
{
   [Problem("Gendarme devs forgot to attribute rules with SuppressMessageEngine")]
   [Solution("Include this rule")]
   [EngineDependency(typeof(SuppressMessageEngine))]
   public class AddSuppressMessageSupportRule : Rule {}
}

К сожалению, это не будет вытягивать атрибуты FxCopCompatibility, которые находятся там (то есть SupressMessage для правила FxCop, которое соответствует правилу жандарма, также подавит правило жандарма), но, по крайней мере, позволяет использовать имена жандармов для подавления.

...