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

时间:2017-09-08 11:04:22

标签: c# nuget .net-core stylecop

将.NET 4.6项目升级到.NET Core 2.0时遇到问题。我们所有的项目都使用由NuGet包提供的自定义StyleCop规则集。规则集位于名为custom.ruleset的文件中,位于包内的内容文件夹中。我们所有的项目都使用这个包,所以得到一份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中,但尝试从项目的.csproj文件中引用它<CodeAnalysisRuleSet>custom.ruleset</CodeAnalysisRuleSet>将无提示失败并恢复使用默认规则集。我可以通过添加<CodeAnalysisRuleSet>$(NuGetPackageRoot)CustomRuleset\1.0.11\contentFiles\any\any\custom.ruleset</CodeAnalysisRuleSet>来强制它工作,但这意味着只要规则集发生变化,csproj就需要更新,因此它也可能是一个手动过程。任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

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

确保以下列方式构建包:

  • 构建\
  • 建立\ custom.ruleset
  • build \ {YourPackageName} .targets(例如CustomRuleset.targets

此结构使.targets文件按惯例自动导入到使用项目中。

然后.targets文件应包含:

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

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

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