visual-studio - 将参考项目的依赖项添加到 NuGet 包
问题描述
我正在使用dotnet pack
命令为以下场景创建 NuGet 包:
项目结构:
Project B
|----> Project A
Project A
|----> SomePackage
我想创建一个包含ProjectB.dll
、、ProjectA.dll
和SomePackage
作为 NuGet 包依赖项的 NuGet 包。
为了包含ProjectA.dll
在 NuGet 包中(而不是包依赖项),我使用了此处建议的以下解决方案。
在ProjectB.csproj
:
<ProjectReference Include="ProjectA.csproj" PrivateAssets="all"/>
<PropertyGroup>
<TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
</PropertyGroup>
<Target Name="CopyProjectReferencesToPackage" DependsOnTargets="BuildOnlySettings;ResolveReferences">
<ItemGroup>
<!-- Filter out unnecessary files -->
<_ReferenceCopyLocalPaths Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')->WithMetadataValue('PrivateAssets', 'All'))"/>
</ItemGroup>
<!-- Print batches for debug purposes -->
<Message Text="Batch for .nupkg: ReferenceCopyLocalPaths = @(_ReferenceCopyLocalPaths), ReferenceCopyLocalPaths.DestinationSubDirectory = %(_ReferenceCopyLocalPaths.DestinationSubDirectory) Filename = %(_ReferenceCopyLocalPaths.Filename) Extension = %(_ReferenceCopyLocalPaths.Extension)" Importance="High" Condition="'@(_ReferenceCopyLocalPaths)' != ''" />
<ItemGroup>
<!-- Add file to package with consideration of sub folder. If empty, the root folder is chosen. -->
<BuildOutputInPackage Include="@(_ReferenceCopyLocalPaths)" TargetPath="%(_ReferenceCopyLocalPaths.DestinationSubDirectory)"/>
</ItemGroup>
</Target>
问题:
当我运行时dotnet pack ProjectB.csproj
,我得到一个包含 ProjectA.dll 和 Project B.dll 的包,但不依赖于SomePackage
.
问题:
如何将依赖项添加SomePackage
到ProjectB
NuGet 包?
可能的解决方案:
- 手动将 ProjectB 中的包引用添加到
SomePackage
. - 创建
ProjectB.nuspec
文件并手动将依赖项添加到SomePakcage
.
这两种方法的缺点:我需要为每个ProjectA
使用的 NuGet 包添加依赖项,这很容易忘记和破坏。
解决方案
您已用于PrivateAssets="all"
Project A ,这意味着它的传递依赖项是私有的,主Project B无法访问。我们通常使用它来禁用引用项目的依赖关系。
因此,如果您使用它,您将无法从引用的项目中获取传递依赖项。并且它会使项目A成为一个程序集dll,并使其失去nuget包的能力及其传递依赖。
如果您仍想实现目标,则应注意以下几点:
1)直接将PackageReference
Project A的csproj中的node等传递依赖复制到Project B的csproj中。
<PackageReference Include="SomePackage" Version="*.*.*" />
......
在这种情况下,您不必使用ProjectB.nuspec
或 nuget 包管理器 UI。
2)放弃使用PrivateAssets="all"
项目A,将项目A作为nuget包。确保其 nuget 功能的完整性。
除此之外,别无他法。
推荐阅读
- r - R ggpot:在一页上安排几个用循环创建的ggplots/对每个图进行不同的命名
- c++ - 在 c++ 代码中,set.erase(it) 正在停止执行,其中 it=set.begin() 用于一组对,为什么会发生这种情况?
- django - 模型(django)中主键的默认数据类型,当前路径,url '/app' 与这些中的任何一个都不匹配
- ruby - 将方法委托给方法的结果
- c++ - 如何找出动态特征向量的大小(以字节为单位)?
- python - 熊猫数据框选择当前列而不保存
- python - Python If 语句 - 显示数字结果
- javascript - 为什么过滤器会从我的数组中删除索引 0
- python - python和Flask框架中的索引超出范围
- vue.js - Openlayer 和 vuejs - addEventlistener 上的错误