从命令行运行 FxCop 分析器

匿名

我正在尝试使用新的 FxCop 分析器,但它们仅作为 NuGet 包或作为 VSIX 扩展提供。我希望能够直接运行它们,无论是从 C# 程序内部还是从命令行。有人有什么建议吗?即使是关于在哪里可以找到 NuGet 或 VSIX 的可执行文件的一般信息也会有所帮助。

(我知道 fxcopcmd.exe,但这是旧版本,它仅适用于构建的 .exes 或 .dlls。如果可能,我需要在构建之前工作的东西。)

匿名

回答我自己的问题,以防其他人必须处理这个问题。我找到了一个解决方案,但公平的警告,它并不漂亮。

  • 我从 Github 获取了一个示例 C# 解决方案,将其加载到 Visual Studio 中,并使用 NuGet 安装 FxCop 分析器。这安装了分析器,并更改了解决方案的 .csproj 文件以引用它们。就我而言,我在 C:\users\myname.nuget\packages 中找到了分析器的副本。
  • 我将修改后的 .csproj 文件与原始文件进行了比较,以查看在安装过程中进行了哪些更改。我建议任何跟随者自己进行比较,但就我而言,更改是:
    • 顶部的五个导入元素引用了各种 .props 文件。
    • 一个空的 NuGetPackageImportStamp 元素。
    • 靠近底部的两个新 ItemGroups,第一个包含名为“None”的单个元素,第二个包含引用 .dll 的各种分析器元素。
    • 一个新的 Target 来确保 .props 文件确实存在。
  • 我编写了一个 C# 程序,该程序采用了任意解决方案,在其中找到了所有 .csproj 文件,并手动向其中添加了这些新的 XML 元素。我跳过了单元素 ItemGroup 和 Target 没有任何问题。

理想情况下,您将(从同一个 C# 程序内部)在 .sln 文件上调用 msbuild,保存与正则表达式匹配的每个输出行“):警告 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?
    }

据我所知,它有效,但我不知道如果您尝试在已经正常安装了分析器的解决方案上执行此操作会发生什么。

通过 msbuild 运行 FxCop 分析器似乎效率低下,但我还没有找到更好的方法。它们看起来像是只在编译器中工作。我希望我是错的,我仍然很感激有关如何自动运行分析器不必构建整个项目的任何建议

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从命令行运行特定的 python 解释器

如何从命令行运行模拟器

Mysqli 从命令行运行,但不能通过 HTML/浏览器运行

在VS 2015中从命令行运行代码分析工具

PhpStorm的代码检查器可以从命令行运行吗?

Jmeter - 从命令行运行测试后如何查看采样器数据?

从命令行运行Selenium服务器时如何提高日志级别?

iOS模拟器不再使用phonegap从命令行运行

从命令行运行Java到Kotlin转换器?

从命令行运行Maven球衣服务器

命令行工具的静态分析器问题

从命令行运行时,Eclipse的Java编译器会生成不同的堆栈跟踪

代码在脚本编辑器中有效,但在从命令行运行时无效

Elixir-从命令行运行时,记录器输出是彩色的,而从iex运行时则不是

使用 NCrunch、FxCop 分析器和“警告作为错误”:如何在 NCrunch 中配置警告严重性?

在命令行下,如何编译F#词法分析器,然后在Mac OS上运行它?

从命令行运行PackageMaker

从命令行运行功能

从命令行运行Scheme

无法从命令行运行

从命令行运行Python

从命令行运行PHP

如何为命令行PHP脚本触发XDebug分析器?

如何污染 Clang 静态分析器中的命令行参数

通过命令行运行Vim与在Vim编辑器中运行Vim的区别

如何使用SonarQube服务器上的质量配置文件从命令行本地运行代码分析?

通过命令行运行SQL脚本到远程服务器

Mono编译器生成的.exe直接从linux命令行运行,为什么?

在Ubuntu服务器上通过命令行运行LaTeX