在 Roslyn 分析器包的 .nuspec 中不可能有 NuGet 依赖项吗?
Is it impossible to have NuGet-dependencies at .nuspec of a Roslyn analyzer package?
场景 1(好):
- 通过 Class-Library (.Net Standard 2.0) 模板创建新的 VisualStudio 解决方案。
- 为其安装任何 nuGet 包(例如
Newtonsoft.Json
)
- 右键单击项目,Properties -> Package -> 标记“Generate NuGet package on build”
- 构建解决方案
- 检查生成的
.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(差):
让我们以类似的方式移动:
- 创建新的 VisualStudio 解决方案但是通过“Analyzer with Codefix”模板。 (如果您检查
.Package
项目,您会发现,它与我们的第一个示例相同 - 它是 Class-目标框架 .Net Standard 2.0 的库)
- 为其安装相同的 nuGet 包(例如
Newtonsoft.Json
)
- 右键单击项目
.Package
,Properties -> Package -> 你会看到,“Generate NuGet package on build" 已被标记。
- 构建解决方案
- 检查生成的
.nupckg
文件(它位于 .Package
项目 bin/Debug 文件夹中)- 你会发现,.nuspec
没有 包含部分 <dependencies>
。
因此,当您将此 .nupckg
安装到某个项目时,Newtonsoft.Json
将 不会 安装到它。
我的问题:
- 为什么行为不同?
- Roslyn 分析器包的
.nuspec
是否可能有 NuGet 依赖项?
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) 重建您的项目,然后您将看到正确的行为。
场景 1(好):
- 通过 Class-Library (.Net Standard 2.0) 模板创建新的 VisualStudio 解决方案。
- 为其安装任何 nuGet 包(例如
Newtonsoft.Json
) - 右键单击项目,Properties -> Package -> 标记“Generate NuGet package on build”
- 构建解决方案
- 检查生成的
.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(差):
让我们以类似的方式移动:
- 创建新的 VisualStudio 解决方案但是通过“Analyzer with Codefix”模板。 (如果您检查
.Package
项目,您会发现,它与我们的第一个示例相同 - 它是 Class-目标框架 .Net Standard 2.0 的库) - 为其安装相同的 nuGet 包(例如
Newtonsoft.Json
) - 右键单击项目
.Package
,Properties -> Package -> 你会看到,“Generate NuGet package on build" 已被标记。 - 构建解决方案
- 检查生成的
.nupckg
文件(它位于.Package
项目 bin/Debug 文件夹中)- 你会发现,.nuspec
没有 包含部分<dependencies>
。 因此,当您将此.nupckg
安装到某个项目时,Newtonsoft.Json
将 不会 安装到它。
我的问题:
- 为什么行为不同?
- Roslyn 分析器包的
.nuspec
是否可能有 NuGet 依赖项?
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) 重建您的项目,然后您将看到正确的行为。