在 Roslyn 分析器包的 .nuspec 中不可能有 NuGet 依赖项吗?

Is it impossible to have NuGet-dependencies at .nuspec of a Roslyn analyzer package?

场景 1(好):

  1. 通过 Class-Library (.Net Standard 2.0) 模板创建新的 VisualStudio 解决方案。
  2. 为其安装任何 nuGet 包(例如 Newtonsoft.Json
  3. 右键单击项目,Properties -> Package -> 标记“Generate NuGet package on build
  4. 构建解决方案
  5. 检查生成的 .nupckg 文件(由 7-Zip 的 NuGet package Explorer)- 你会发现,.nuspec 包含部分:
<dependencies>
  <group targetFramework=".NETStandard2.0">
    <dependency id="Newtonsoft.Json" version="13.0.1" exclude="Build,Analyzers" />
  </group>
</dependencies>

因此,如果您将此 .nupckg 安装到某个项目,Newtonsoft.Json 也会被安装。好!


但是!让我们看看 场景 2(差):

让我们以类似的方式移动:

  1. 创建新的 VisualStudio 解决方案但是通过“Analyzer with Codefix”模板。 (如果您检查 .Package 项目,您会发现,它与我们的第一个示例相同 - 它是 Class-目标框架 .Net Standard 2.0 的库)
  2. 为其安装相同的 nuGet 包(例如 Newtonsoft.Json
  3. 右键单击项目 .PackageProperties -> Package -> 你会看到,“Generate NuGet package on build" 已被标记。
  4. 构建解决方案
  5. 检查生成的 .nupckg 文件(它位于 .Package 项目 bin/Debug 文件夹中)- 你会发现,.nuspec 没有 包含部分 <dependencies>。 因此,当您将此 .nupckg 安装到某个项目时,Newtonsoft.Json 不会 安装到它。

我的问题:

PS:我找到了 a solution,但我不喜欢它,`因为它贬低了包管理的意义('因为我们只是将依赖 dll 刻录到我们的包中) .这是最好的解决方案吗?

问题是你添加了

<SuppressDependenciesWhenPacking>true</SuppressDependenciesWhenPacking>

xxx.Package项目下。

当您打包 Analyzer.Package 项目时,它将阻止所有项目引用和 nuget 引用被打包到 nupkg(作为 nuget 依赖项)。并且新的 Newtonsoft.Json nuget 包也被阻止了。

也就是说,节点会阻止所有引用的项目,安装的nuget包。那是作者设计的。作者的目标是防止项目引用为 nupkg 的 nuget 依赖项。否则会报错。

修复它很容易。只需修改 Analyzer.Package.csproj 文件:

1)将开关改为false.

<SuppressDependenciesWhenPacking>false</SuppressDependenciesWhenPacking>

2)和然后有选择地屏蔽要打包的项目引用。在那下面使用<PrivateAssets>All</PrivateAssets>

  <ItemGroup>
    <ProjectReference Include="..\Analyzer2.CodeFixes\Analyzer2.CodeFixes.csproj">
      <PrivateAssets>All</PrivateAssets>
    </ProjectReference>
    <ProjectReference Include="..\Analyzer2\Analyzer2.csproj">
      <PrivateAssets>All</PrivateAssets>
    </ProjectReference>
  </ItemGroup>

3) 重建您的项目,然后您将看到正确的行为。