Запуск анализаторов FxCop из командной строки

Я пытаюсь использовать новые анализаторы FxCop, но они доступны только в виде пакетов NuGet или расширений VSIX. Я хотел бы иметь возможность запускать их напрямую, либо из программы C #, либо из командной строки. У кого-нибудь есть совет? Помогла бы даже общая информация о том, где можно найти исполняемые файлы для NuGet или VSIX.

(Я знаю о fxcopcmd.exe, но это устаревшая версия, и она работает только со встроенными .exes или .dll. Если это вообще возможно, мне нужно что-то, что работает перед сборкой.)


person anon    schedule 19.06.2020    source источник
comment
Я не вижу параметров командной строки в текущих документах. Вероятно, вы можете поместить их в файл проекта (через NuGet) и запустить из MSBUILD. Просто догадка   -  person Flydog57    schedule 19.06.2020


Ответы (1)


Отвечая на свой вопрос, если кто-то еще столкнется с этим. Я нашел решение, но честно предупреждаю, это некрасиво.

  • Я взял пример решения C # из Github, загрузил его в Visual Studio и использовал NuGet для установки анализаторов FxCop. Это установило анализаторы и изменило файлы .csproj решения, чтобы они ссылались на них. В моем случае я нашел копию анализаторов в C: \ users \ myname.nuget \ packages.
  • I compared the modified .csproj files to the originals, to see what changes had been made during installation. I recommend anyone following along make this comparison themselves, but in my case, the changes were:
    • Five Import elements at the top referencing various .props files.
    • Пустой элемент NuGetPackageImportStamp.
    • Две новые ItemGroups внизу, первая содержит единственный элемент с именем None, а вторая содержит различные элементы Analyzer, ссылающиеся на .dll.
    • Новая цель, чтобы гарантировать, что файлы .props действительно существуют.
  • Я написал программу на C #, которая приняла произвольное решение, нашла внутри все файлы .csproj и вручную добавила к ним эти новые элементы XML. Я без проблем пропустил одноэлементную ItemGroup и Target.

В идеале вы должны затем (из той же программы C #) вызвать msbuild в файле .sln, сохранить каждую строку вывода, соответствующую регулярному выражению): предупреждение CA \ d \ d \ d \ d: (т.е. предупреждения, созданные FxCop) и восстановить исходные файлы .csproj. Все это я делал вручную. Вот код для манипуляции с XML:

static void addAnalyzersToCsProj(string file)
    {
        string[] packages = new string[]
        {
            @"C:\users\myname\.nuget\packages\microsoft.codeanalysis.fxcopanalyzers\3.0.0\build\Microsoft.CodeAnalysis.FxCopAnalyzers.props",
            @"C:\users\myname\.nuget\packages\microsoft.codeanalysis.versioncheckanalyzer\3.0.0\build\Microsoft.CodeAnalysis.VersionCheckAnalyzer.props",
            @"C:\users\myname\.nuget\packages\microsoft.codequality.analyzers\3.0.0\build\Microsoft.CodeQuality.Analyzers.props",
            @"C:\users\myname\.nuget\packages\microsoft.netcore.analyzers\3.0.0\build\Microsoft.NetCore.Analyzers.props",
            @"C:\users\myname\.nuget\packages\microsoft.netframework.analyzers\3.0.0\build\Microsoft.NetFramework.Analyzers.props",
        };
        var root = XElement.Load(file);
        var ns = "";
        for (var i = 0; i < 5; i++)
        {
            XElement packageImport = new XElement(ns+"Import");
            packageImport.SetAttributeValue("Project", packages[i]);
            string condition = "Exists('" + packages[i] + "')";
            packageImport.SetAttributeValue("Condition", condition);
            root.AddFirst(packageImport);
        }

        var propertyGroup = root.Descendants(ns + "PropertyGroup").First();
        var stamp = new XElement(ns+"NuGetPackageImportStamp", "");
        propertyGroup.Elements().Last().AddAfterSelf(stamp);

        var newGroup = new XElement(ns+"ItemGroup");
        // do we need to include the "None Include="packages.config"" thing?
        string[] libraries = new string[]
        {
            @"C:\users\myname\.nuget\packages\microsoft.codeanalysis.versioncheckanalyzer\3.0.0\analyzers\dotnet\cs\Microsoft.CodeAnalysis.VersionCheckAnalyzer.resources.dll",
            @"C:\users\myname\.nuget\packages\microsoft.codeanalysis.versioncheckanalyzer\3.0.0\analyzers\dotnet\Microsoft.CodeAnalysis.VersionCheckAnalyzer.dll",
            @"C:\users\myname\.nuget\packages\microsoft.codequality.analyzers\3.0.0\analyzers\dotnet\cs\Humanizer.dll",
            @"C:\users\myname\.nuget\packages\microsoft.codequality.analyzers\3.0.0\analyzers\dotnet\cs\Microsoft.CodeQuality.Analyzers.dll",
            @"C:\users\myname\.nuget\packages\microsoft.codequality.analyzers\3.0.0\analyzers\dotnet\cs\Microsoft.CodeQuality.CSharp.Analyzers.dll",
            @"C:\users\myname\.nuget\packages\microsoft.netcore.analyzers\3.0.0\analyzers\dotnet\cs\Microsoft.NetCore.Analyzers.dll",
            @"C:\users\myname\.nuget\packages\microsoft.netcore.analyzers\3.0.0\analyzers\dotnet\cs\Microsoft.NetCore.CSharp.Analyzers.dll",
            @"C:\users\myname\.nuget\packages\microsoft.netframework.analyzers\3.0.0\analyzers\dotnet\cs\Microsoft.NetFramework.Analyzers.dll",
            @"C:\users\myname\.nuget\packages\microsoft.netframework.analyzers\3.0.0\analyzers\dotnet\cs\Microsoft.NetFramework.CSharp.Analyzers.dll",
        };
        foreach (string lib in libraries)
        {
            XElement analyzer = new XElement(ns+"Analyzer");
            analyzer.SetAttributeValue("Include", lib);
            newGroup.AddFirst(analyzer);
        }
        Console.WriteLine(root.Elements().Last().ToString());
        root.Elements().Last().AddAfterSelf(newGroup);
        root.Save(file, SaveOptions.None);
        // and do we need to include the error checking target?
    }

Насколько я могу судить, это работает, хотя я понятия не имею, что произойдет, если вы попытаетесь сделать это в решении, в котором анализаторы уже установлены нормально.

Запуск анализаторов FxCop через msbuild кажется неэффективным, но я не нашел лучшего способа сделать это. Похоже, они созданы для работы только в компиляторе. Надеюсь, я ошибаюсь, и я все равно был бы признателен за любой совет о том, как запускать анализаторы автоматически без необходимости сборки всего проекта.

person anon    schedule 24.06.2020
comment
/ челюсть падает. Есть ли шанс, что вы улучшили это с тех пор? - person Mark Mayo; 16.10.2020