如何在 VS2017 中使用 NuGet 包发送 stylecop.json 和 custom.ruleset 文件

How to ship the stylecop.json and custom.ruleset files with a NuGet package in VS2017

目前我们正在从 VS2015 切换到 VS2017。我们的升级步骤之一是从 stylecop 切换到新的 Stylecop.Analyzer 包。新的 Stylecop 使用 2 个文件。 stylecop.json 和 Stylecop.ruleset。

目标: 我想提供 stylecop 文件作为自定义 nuget 包。但我不知道如何创建所需的 .csproj 条目。

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
...
        <CodeAnalysisRuleSet>packages\My.StyleCop.1.0.0-pre15\RuleSet\My.StyleCop.ruleset</CodeAnalysisRuleSet>
    </PropertyGroup>    
...
    <ItemGroup>
        <AdditionalFiles Include="packages\My.StyleCop.1.0.0-pre15\Config\stylecop.json">
            <Link>stylecop.json</Link> 
        </AdditionalFiles>  
    </ItemGroup>
</Project>

过去,可以使用 install.ps1 脚本来完成这些工作。但是对于 NuGet 3.(或 4.),安装脚本已过时,将被忽略。

我已经尝试使用 My.StyleCop.targets:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <AdditionalFiles Include="packages\My.StyleCop.1.0.0-pre17\Config\stylecop.json">
          <Link>stylecop.json</Link> 
        </AdditionalFiles>    
    </ItemGroup>
</Project>

但我也有一些问题。自 NuGet 3.(或 4.)以来,没有解决方案范围的包文件夹,我不知道我可以在此处使用任何变量或占位符来获取我的包的绝对或相对路径。

您可以将 .props.targets 文件添加到包中的 build 文件夹中,它们将被导入到项目中。

.props 文件上,您可以使用 MSBuildThisFileDirectory MSBuild 变量来表示该文件所在的文件夹。

我是怎么做到的:

这是我的 NuGet 包的结构。

解决方法很简单。您需要创建文件。像 NuGet 包一样命名的 .props 和 .targets 文件,并将它们放在包的构建文件夹中。

在这些 MSBuild 文件中,您可以使用 $(MSBuildThisFileDirectory) 变量来获取 NuGet 包的路径。

MSBuildThisFileDirectory  = C:\Users\UserName\.nuget\packages\sig.stylecop.0.0-pre23\build\

我的 SIG.StyleCop.props 文件:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <CodeAnalysisRuleSet>$(MSBuildThisFileDirectory)\..\RuleSet\SIG.combiLink.ruleset</CodeAnalysisRuleSet>
    </PropertyGroup>
</Project>

我的 SIG.StyleCop.targets 文件:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <AdditionalFiles Include="$(MSBuildThisFileDirectory)\..\Config\stylecop.json">
            <Link>stylecop.json</Link> 
        </AdditionalFiles>    
    </ItemGroup>    
</Project>

由于我的包的结构,我需要导航 (..) 进入 Config 和 RuleSet 文件夹。

变量 $(MSBuildThisFileDirectory) 末尾已包含反斜杠。引用规则集和 stylecop.json 文件时省略反斜杠很重要:

<CodeAnalysisRuleSet>$(MSBuildThisFileDirectory)..\RuleSet\SIG.combiLink.ruleset</CodeAnalysisRuleSet>

<AdditionalFiles Include="$(MSBuildThisFileDirectory)..\Config\stylecop.json">

使用双反斜杠,我在 Visual Studio 2017 年遇到了两个奇怪的问题:

  • 每次启动单元测试时都会重建代码,即使没有任何代码更改也是如此

  • IDE 在错误列表 window 中显示许多 StyleCop 错误,并且在滚动条中显示红色标记,即使对于在规则集中明确禁用的规则也是如此。