【问题标题】:Add code analysis ruleset through nuget package通过nuget包添加代码分析规则集
【发布时间】:2013-12-14 13:24:35
【问题描述】:

我正在尝试构建一个能自动添加我们公司的代码分析字典并且可更新的 NuGet 包。

规则集已添加到内容文件夹中,现在我想使用 install.ps1 脚本将规则集添加到项目文件中。
我想出要走的路是使用 envDTE,但除了这个我找不到 CodeAnalysisRuleset 节点的压倒性对象图之外,我找不到太多有用的文档。
http://msdn.microsoft.com/en-us/library/za2b25t3(v=vs.100).aspx

我是否走在正确的道路上?
是否有任何有关如何在 NuGet powershell 中使用 envDTE 的相关教程/文档?
如何运行/调试我的安装脚本,而无需将其实际添加到包中并针对项目进行安装?

旁注
尽管@Nicole Calinoiu 展示了更好的方法,但这些信息稍后可能会派上用场:

foreach ($config in $project.ConfigurationManager){
  $config.Properties.Item("CodeAnalysisRuleSet").Value = "myruleset.ruleset"
}

【问题讨论】:

    标签: c# powershell nuget code-analysis envdte


    【解决方案1】:

    无需编写脚本。规则集和字典都可以通过导入的 MSBuild .props 文件注册,如此处所述https://docs.microsoft.com/en-us/nuget/create-packages/creating-a-package#include-msbuild-props-and-targets-in-a-package

    例如,您的 NuGet 源文件夹结构可能如下所示(假设“CodeAnalysisSettings”是您的包 ID):

    • 构建
      • CodeAnalysisSettings.props
    • 内容
      • MyCustomDictionary.xml
      • MyRules.ruleset

    CodeAnalysisSettings.props 的内容类似于以下内容:

    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <PropertyGroup>
            <RunCodeAnalysis>true</RunCodeAnalysis>
            <CodeAnalysisRuleSet>MyRules.ruleset</CodeAnalysisRuleSet>
        </PropertyGroup>
        <ItemGroup>
            <CodeAnalysisDictionary Include="MyCustomDictionary.xml" />
        </ItemGroup>
    </Project>
    

    【讨论】:

    • 该死!我昨天晚上才发现的!我也完成了导入字典的包。不过谢谢:)
    • 这里有什么我遗漏的吗?我创建了 props 文件,但 NuGet 将 CodeAnalysisDictionary 添加为 Content 的类型,而它应该是 CodeAnalysisDictionary 的类型。我不确定为什么。不过,当我将 Compile 用于我的 cs 文件时,它工作正常。
    • 这是因为 VS UI 使用与代码分析 MSBuild 文件不同的规则来确定内容类型。尽管 UI 显示异常,您应该会发现代码分析正在使用您的字典。
    • @NicoleCalinoiu:可悲的是,事实并非如此。我创建了一个 NuGet 包并将其发布到我的本地硬盘上。当我通过“管理 NuGet 包...”添加包时,它确实在正确的位置正确添加了文件。但是,由于字典被标记为Content 类型而不是CodeAnalysisDictionary,代码分析引擎无法识别它并且不使用自定义字典。您可以通过打破 CA1709 规则来重现此问题(创建一个名为 NuGet 的公共类)。将字典(通过 NuGet)添加为 Content 并不能解决此问题。
    • @NicoleCalinoiu:您能否分享您的 NuGet 解决方案(解包和打包)以及示例项目。每当我使用 NuGet 获取导入的字典文件时,VS2013 将其标记为 Content 的类型,CodeAnalysis 引擎会忽略它......引擎只会在文件的“属性”下查找标记为 CodeAnalysisDictionary 的文件。
    【解决方案2】:

    我遇到了与 cmets 中报告的相同的问题:字典被添加为内容,而不是 CodeAnalysisDictionary

    我在nuget包的install.ps1中添加了这段代码来解决这个问题:

    $dictionary = $project.ProjectItems | Where-Object {$_.Name.EndsWith("CustomDictionary.xml")}
    $dictionary.Properties.Item("Buildaction").Value = [int]5;
    

    【讨论】:

      【解决方案3】:

      您也可以使用以下步骤手动执行此操作。

      • 右键项目
      • 转到属性
      • 转到下拉菜单 [运行此规则集]
      • 选择 [浏览..] 选项
      • 选择您的公司规则集,您可以将其放置在源代码中的预定义位置。
      • 在“打开”窗口中单击“打开”
      • 保存项目文件。

      您可以对解决方案中的其他项目重复该步骤。

      【讨论】:

      • 这就是我们今天所做的。但是在我们拥有的数百个项目中,浪费的时间总和加上不时发生的人为错误。一个 nuget 包会更有趣。
      猜你喜欢
      • 1970-01-01
      • 2018-02-17
      • 2018-06-02
      • 2013-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      相关资源
      最近更新 更多