【问题标题】:Code Analysis is not working with ruleset from nuget package (from .props)代码分析不适用于 nuget 包中的规则集(来自 .props)
【发布时间】:2018-06-02 05:49:35
【问题描述】:

我正在尝试使用我们的 nuget 包中的自定义规则集文件。我已经添加到包 .props 文件的 build 文件夹中:

<Project>
  <PropertyGroup>
    <CodeAnalysisRuleSet>
      $(MSBuildThisFileDirectory)..\My.Shared.ruleset
    </CodeAnalysisRuleSet>
    <RunCodeAnalysis>true</RunCodeAnalysis>
  </PropertyGroup>
</Project>

规则集文件在包根文件夹中,路径正确,正在添加.props文件的导入到csproj文件中。

<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="..\packages\My.Shared.Rulesets.1.0.0.7118\build\My.Shared.Rulesets.props" Condition="Exists('..\packages\My.Shared.Rulesets.1.0.0.7118\build\My.Shared.Rulesets.props')" />
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  ...

但 Visual Studio 没有看到正确的规则集。当我从 References -> Analyzers 打开活动规则集时,它指向不同的文件:MinimumRecommendedRules.ruleset 并且它使用的是该文件中的规则,而不是我的自定义规则。

  • Visual Studio 社区 2017 版本 15.5.0
  • 项目目标框架 4.6.1

【问题讨论】:

    标签: c# nuget visual-studio-2017 stylecop


    【解决方案1】:

    代码分析不适用于 nuget 包(来自 .props)中的规则集

    你应该在package文件夹的content文件夹中设置Rule set文件,这样VS/MSBuild会将该文件添加到你的项目中,然后VS\MSBuild可以将默认的MinimumRecommendedRules.ruleset更改为你的My.Shared.ruleset.ruleset文件。

    例如,您的 NuGet 源文件夹结构可能如下所示(“My.Shared.ruleset”是您的包 ID):

    • 构建

      • My.Shared.ruleset.props
    • 内容

      • My.Shared.ruleset.ruleset

    My.Shared.ruleset.props 的内容类似于以下内容:

    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <PropertyGroup>
            <RunCodeAnalysis>true</RunCodeAnalysis>
            <CodeAnalysisRuleSet>My.Shared.Rulesets.ruleset</CodeAnalysisRuleSet>
        </PropertyGroup>
    </Project>
    

    创建nuget包的步骤:

    • 打开NuGet Package Explorer,选择新的包,编辑->编辑 元数据,将Id改为My.Shared.Rulesets->保存。

    • 内容->添加->内容文件夹->添加现有文件->选择您的My.Shared.Rulesets.ruleset

    • 内容->添加->构建文件夹->添加现有文件->选择您的My.Shared.ruleset.props->保存。

    然后将这个包添加到测试项目中:

    然后您会发现活动规则集已更改为来自 nuget 包的规则集。

    评论更新:

    我们试图避免将规则集文件复制到每个项目。开发人员倾向于更改它并推送到存储库

    如果不想将规则集文件复制到每个项目中,只需更改.props文件中的路径即可,但应确保.props文件中的路径正确,例如。我将.ruleset文件设置在本地路径:D:\ShareFolder\My.Shared.Rulesets.ruleset,然后将.ruleset从nuget包中移出,将.props中的路径改为D:\ShareFolder\My.Shared.Rulesets.ruleset

    希望这会有所帮助。

    【讨论】:

    • 我们试图避免将规则集文件复制到每个项目。开发人员倾向于更改它并推送到存储库;)我认为这是一个 Visual Studio 错误,它无法在正确的位置看到它,因为构建看到了正确的规则集。
    • @MateuszMoska,如果不想将规则集文件复制到每个项目中,只需更改 .props 文件中的路径,但应确保 .props 中的路径正确文件。通过样本测试,它在我这边运行良好。您可以查看我更新的答案以了解详细信息。
    • @MateuszMoska,这个问题有什么更新吗?你的问题解决了吗?如果没有,请告诉我此问题的最新状态。
    • 抱歉,共享文件夹也不是解决方案。我们不得不使用内容中包含文件的版本,因为我们不能在这上面浪费更多时间。我见过的其他解决方案是使用 install.ps1 脚本编辑 csproj 文件,并将文件作为包中的链接放入解决方案中,但根据我的阅读,nuget 团队正在远离这些脚本。还将属性组中的路径直接添加到规则集文件,而不是使用 .props 导入工作。我认为这是 Visual Studio 中的一个错误,我已经报告了它,稍后会看到结果。感谢您的专业帮助。
    • 关于为什么这对我不起作用的一个警告......你must name the props file to match the name of the NuGet package 例如:.props
    猜你喜欢
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多