通过 NuGet 为 .net 核心项目提供代码分析规则集

Providing a code analysis ruleset to a .net core project through NuGet

我 运行 在将 .NET 4.6 项目升级到 .NET Core 2.0 时遇到了问题。我们所有的项目都使用由 NuGet 包提供的自定义 StyleCop 规则集。规则集位于名为 custom.ruleset 的文件中,位于包内的 content 文件夹中。我们所有的项目都使用这个包,所以得到一份 custom.ruleset.

但是,在 Core 2.0 和 Standard 2.0 项目中这不起作用。不再从包的内容文件夹复制文件,我们被告知改用 contentFiles 文件夹。

我有一个 nuspec,现在看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
  <version>1.0.11</version>      
  <metadata>
    ...
    <contentFiles>
      <files include="content\*.ruleset" buildAction="None" copyToOutput="false" flatten="true"/>
    </contentFiles>
  </metadata>
  <files>
    <file src="content\**" target="contentFiles/any/any" />
  </files>
</package>

使用此结构,规则集出现在项目下的 Visual Studio 中,但尝试使用 <CodeAnalysisRuleSet>custom.ruleset</CodeAnalysisRuleSet> 从项目的 .csproj 文件中引用它会无提示地失败并恢复为使用默认规则集。我可以通过添加 <CodeAnalysisRuleSet>$(NuGetPackageRoot)CustomRuleset.0.11\contentFiles\any\any\custom.ruleset</CodeAnalysisRuleSet> 来强制它工作,但这意味着只要规则集发生变化,csproj 就需要更新,所以它也可能是一个手动过程。有什么解决办法吗?

我们的想法是不尝试将文件部署为内容,而是将构建逻辑添加到 NuGet 包。

确保包的结构如下:

  • 构建\
  • build\custom.规则集
  • build\{YourPackageName}.targets(例如CustomRuleset.targets

此结构会导致 .targets 文件按照约定自动导入到使用项目中。

.targets 文件应包含:

<Project>
  <PropertyGroup>
    <CodeAnalysisRuleSet>$(MSBuildThisFileDirectory)custom.ruleset</CodeAnalysisRuleSet>
  </PropertyGroup>
</Project>

这将导致项目的规则集 属性 被覆盖到与 .targets 文件相关的位置。

请注意,这也适用于使用 VS 2017 (15.2+) 中可选的新 PackageReference 样式的 NuGet 包(替换 packages.config)的 .net 框架项目。