Анализатор, который проверяет ссылки на проекты - PullRequest
0 голосов
/ 02 июня 2018

Я хотел бы создать решение, которое контролирует ссылки на проекты в проектах C #.В идеале это решение не зависит от IDE, поэтому его можно использовать с Visual Studio, Jetbrains Rider или даже с кодом VS.Причиной этого является то, что я видел решения, которые полностью запутались из-за людей, создающих почти произвольные ссылки на проекты.Сложно получить их сразу после того, как проект вырос до определенного размера.

Я знаю, что Visual Studio Enterprise предлагает это "из коробки".К сожалению, в моей нынешней компании у нас нет VS Enterprise.Таким образом, я хочу создать это самостоятельно.

Так что будет лучшим способом сделать это?После некоторых исследований я думаю, что использование платформы компилятора .NET («Roslyn») с ее API рабочей области может быть хорошей идеей?Похоже, я мог бы развернуть его как пакет NuGet, который затем можно использовать в любой среде IDE или для автоматизации сборки.Но, может быть, есть более простой или лучший способ, я хотел бы услышать ваше мнение по этому поводу, прежде чем я начну копаться в этом.

Кроме того: если путь "Рослин" правильный, есть ли хорошие ресурсыо том, как создать анализатор, работающий с API-интерфейсами Workspace?

Заранее спасибо.

1 Ответ

0 голосов
/ 14 июня 2018

В вашем анализаторе зарегистрируйте действие запуска компиляции:

public override void Initialize(AnalysisContext context)
{
    context.RegisterCompilationStartAction(Initialize);
}

private void Initialize(CompilationStartAnalysisContext context)
{
    var compilation = context.Compilation;
}

Из этого объекта компиляции у вас есть различные опции:

var referencedAssemblyNames = compilation.ReferencedAssemblyNames;

или

var references = compilation.References;

Тогда сделайте свой анализ.Чтобы сообщить о диагностике, зарегистрируйте действие на CompilationStartAnalysisContext, используя context.RegisterCompilationEndAction.

Если вам не нужно просматривать фактический контент проекта для анализа, вы можете просто использовать RegisterCompilationAction следующим образом:

[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class TooManyReferencesAnalyzer : DiagnosticAnalyzer
{
    private static DiagnosticDescriptor TooManyReferences { get; } =
        new DiagnosticDescriptor(
            "DEMO",
            "Don't use too many references",
            "The project '{0}' has {1} references",
            category: "Maintainability",
            defaultSeverity: DiagnosticSeverity.Warning,
            isEnabledByDefault: true);

    public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics =>
        ImmutableArray.Create(TooManyReferences);

    public override void Initialize(AnalysisContext context)
    {
        context.RegisterCompilationAction(AnalyzeCompilation);
    }

    private void AnalyzeCompilation(CompilationAnalysisContext context)
    {
        var compilation = context.Compilation;
        int referenceCount = compilation.References.Count();

        if (referenceCount > 5)
        {
            context.ReportDiagnostic(
                Diagnostic.Create(
                    TooManyReferences,
                    null,
                    compilation.AssemblyName,
                    referenceCount));
        }
    }
}
...