You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的包。

验证
  1. 重新打包Project A,解压nupkg文件:
    • 方案1查看lib目录,确认是否包含Project C.dll;
    • 方案2查看.nuspec文件的<dependencies>节点,确认是否存在Project C的依赖项。
  2. 在测试项目中安装该NuGet包,运行验证错误是否消失。

内容的提问来源于stack exchange,提问作者Edward Elric

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 03:33:16