dotnet pack打包NuGet包未包含项目引用代码如何解决
问题根因
默认dotnet pack流程处理ProjectReference时,会将被引用的项目作为独立NuGet依赖写入最终包的依赖清单,不会把被引用项目的编译输出DLL打包进当前项目的nupkg文件中。
你的场景中,自定义fork的Hypermedia分支没有发布到公共NuGet源,所以安装你SDK包的项目会自动拉取官方公开版本的Hypermedia包,公开版本不存在你补丁里新增的RenameFieldUsingJsonPropertyName方法,最终触发运行时MissingMethodException。
解决方案
不需要单独发布fork的子项目包,直接修改SDK项目的csproj配置,即可将项目引用的代码输出打包进最终nupkg:
- 首先在csproj的全局
PropertyGroup节点下添加构建目标配置,让打包流程主动将指定的项目引用输出复制到包内:
<PropertyGroup> <!-- 保留你原有的配置,比如TargetFramework、PackageId、Version等 --> <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput> </PropertyGroup>
- 修改所有需要内嵌到包内的
ProjectReference节点,添加属性标记为私有引用,避免打包时将其识别为外部NuGet依赖:
<ItemGroup> <ProjectReference Include="..\..\..\vendor\Hypermedia\Src\Hypermedia.JsonApi.Client\Hypermedia.JsonApi.Client.csproj"> <PrivateAssets>all</PrivateAssets> <ReferenceOutputAssembly>true</ReferenceOutputAssembly> </ProjectReference> <ProjectReference Include="..\..\..\vendor\Hypermedia\Src\Hypermedia\Hypermedia.csproj"> <PrivateAssets>all</PrivateAssets> <ReferenceOutputAssembly>true</ReferenceOutputAssembly> </ProjectReference> </ItemGroup>
验证方式
重新执行dotnet pack命令生成新的nupkg包后,可将文件后缀改为.zip解压,查看lib/[你的目标框架版本]目录下是否同时包含SDK自身DLL、以及两个Hypermedia相关的DLL,存在即说明配置生效。
注意:如果fork的Hypermedia项目本身依赖其他NuGet包,这些包会自动作为你SDK包的传递依赖被引入,不需要额外手动配置。你之前查到的旧回答提到的参数是传统.NET Framework下nuget.exe打包流程的配置,在SDK风格项目的
dotnet pack流程中已被上述MSBuild配置替代,所以无法直接使用。
内容的提问来源于stack exchange,提问作者ScottishTapWater
相关产品推荐
相关产品推荐

