Можно ли подавить конкретное сообщение о дефекте жандармерии? Я хотел бы сделать это в исходном коде с помощью флага или чего-то подобного.
Как подавить жандармские пороки?
Ответы (3)
Как уже отмечалось, версия 2.10 поддерживает атрибут [SuppressMessage].
Например, чтобы подавить правило AvoidNonAlphanumericIdentifierRule, сделайте следующее:
[SuppressMessage("Gendarme.Rules.Naming", "AvoidNonAlphanumericIdentifierRule")]
protected void Application_Start()
{
...
}
Обратите внимание, что вам нужно указать имя сборки, в которой живет правило... в этом случае, AvoidNonAlphanumericIdentifierRule находится в Gendarme.Rules.Naming.dll. Полный список правил и их имена сборок находятся здесь.
CODE_ANALYSIS
, определенным чтобы это работало.
- person M.Babcock; 26.09.2012
Если вы используете средство запуска консоли, вы можете использовать файл дефекта (вне исходного кода), чтобы подавить любой дефект в методе, типе или сборке.
Новый Gendarme 2.8 имеет базовую (читай, неполную и глючную) поддержку атрибута [SuppressMessage] (такой же, как у fxcop). Ожидайте, что эта функция будет работать должным образом после выпуска версии 2.10.
Насколько я понимаю, нет способа включить [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), но, по крайней мере, позволяет вам использовать Имена жандармов подавить.