通过 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 框架项目。
我 运行 在将 .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 框架项目。