NuGet包无法解析依赖,如何将所有依赖库合并到单个NuGet包中?
问题
基于Project A打包的NuGet包,在使用时提示找不到依赖项Project C.dll。项目结构为:Project A 引用 Project B,Project B 引用 Project C。
Project A.csproj 内容:
<PropertyGroup> <TargetsForTfmSpecificBuildOutput> $(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage </TargetsForTfmSpecificBuildOutput> </PropertyGroup> <ItemGroup> <ProjectReference Include="..\ProjectB.csproj"> <PrivateAssets>All</PrivateAssets> </ProjectReference> </ItemGroup> <Target Name="CopyProjectReferencesToPackage" DependsOnTargets="BuildOnlySettings;ResolveReferences"> <ItemGroup> <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))->WithMetadataValue('PrivateAssets', 'All'))" /> </ItemGroup> </Target>
Project B.csproj 内容:
<ItemGroup> <PackageReference Include="AWSSDK.Kinesis" version="3.0" /> <PackageReference Include="AWSSDK.SQS" version="3.0" /> <ProjectReference Include="..\ProjectC.csproj"> <PrivateAssets>All</PrivateAssets> </ProjectReference> </ItemGroup>
原因
当前的CopyProjectReferencesToPackage目标只处理了Project A直接引用的Project B,没有递归捕获Project B引用的Project C。同时PrivateAssets="All"会阻止依赖项自动传递到NuGet包,加上筛选逻辑限制了仅包含标记PrivateAssets=All的直接引用,导致间接依赖的Project C.dll没被打包进去。
解决方案
方案1:修改目标,打包所有间接项目引用的DLL
直接调整Project A.csproj中的CopyProjectReferencesToPackage目标,去掉多余的筛选条件,确保所有本地复制的项目引用DLL(包括间接引用的Project C)都被打包:
<PropertyGroup> <TargetsForTfmSpecificBuildOutput> $(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage </TargetsForTfmSpecificBuildOutput> </PropertyGroup> <ItemGroup> <ProjectReference Include="..\ProjectB.csproj"> <PrivateAssets>All</PrivateAssets> </ProjectReference> </ItemGroup> <Target Name="CopyProjectReferencesToPackage" DependsOnTargets="BuildOnlySettings;ResolveReferences"> <ItemGroup> <!-- 包含所有本地复制的项目引用DLL --> <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.ReferenceSourceTarget)' == 'ProjectReference'" /> </ItemGroup> </Target>
方案2:调整依赖传递(适合Project C已打包为NuGet的场景)
如果Project C本身也是一个NuGet包,可以修改Project B中对Project C的引用配置,允许依赖传递到上层的Project A NuGet包:
<ItemGroup> <PackageReference Include="AWSSDK.Kinesis" version="3.0" /> <PackageReference Include="AWSSDK.SQS" version="3.0" /> <ProjectReference Include="..\ProjectC.csproj"> <!-- 允许依赖传递,仅保留内容文件和分析器为私有 --> <PrivateAssets>ContentFiles;Analyzers</PrivateAssets> </ProjectReference> </ItemGroup>
这样Project A打包时会自动将Project C添加为NuGet依赖,使用时会自动拉取Project C的包。
验证
- 重新打包Project A,解压nupkg文件:
- 方案1查看
lib目录,确认是否包含Project C.dll; - 方案2查看
.nuspec文件的<dependencies>节点,确认是否存在Project C的依赖项。
- 方案1查看
- 在测试项目中安装该NuGet包,运行验证错误是否消失。
内容的提问来源于stack exchange,提问作者Edward Elric
相关产品推荐
相关产品推荐

