Как подавить жандармские пороки?

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


person Juergen    schedule 14.04.2010    source источник


Ответы (3)


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

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

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

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

person Lee Harold    schedule 10.05.2011
comment
Следует отметить, что сборка должна быть скомпилирована с символом CODE_ANALYSIS, определенным чтобы это работало. - person M.Babcock; 26.09.2012
comment
Кроме того, в последних версиях добавлена ​​совместимость с FxCop, поэтому, если у вас уже есть SuppressMessage от FxCop и эквивалентное правило в Gendarme, сообщение будет подавлено. - person Marc Climent; 08.04.2014

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

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

person poupou    schedule 10.11.2010

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

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

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

Я могу ошибаться, но похоже на недосмотр, что они забыли вернуться и применить соответствующие атрибуты 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, которое соответствует правилу Gendarme, также подавляет правило Gendarme), но, по крайней мере, позволяет вам использовать Имена жандармов подавить.

person Ethan J. Brown    schedule 29.12.2010