如何将引用项目打包进单个NuGet包,无需单独发布依赖包
解决NuGet包嵌入依赖项目无需单独发布的问题
你遇到的问题核心是:虽然手动把依赖项目的dll放进了NuGet包的lib目录,但原项目的ProjectReference会让NuGet自动生成依赖项声明,导致安装包时依然会去查找这些依赖的NuGet包。下面是两种可行的解决方法:
方法一:嵌入依赖项目的DLL并移除自动依赖声明
- 修改主项目(LookupListCache)的.csproj文件,对每个依赖项目的引用添加配置,阻止NuGet将其识别为外部依赖:
<ProjectReference Include="..\LookupListCache.Common\LookupListCache.Common.csproj"> <PrivateAssets>all</PrivateAssets> <ExcludeAssets>runtime</ExcludeAssets> </ProjectReference>
PrivateAssets="all"表示这些依赖项不会被传递到引用当前包的项目ExcludeAssets="runtime"避免NuGet将依赖项的运行时文件作为外部依赖处理
- 接着在主项目的.csproj中添加打包规则,确保依赖项目的DLL被包含到NuGet包的lib目录:
<ItemGroup> <Content Include="$(OutputPath)\LookupListCache.Common.dll"> <Pack>true</Pack> <PackagePath>lib\$(TargetFramework)</PackagePath> </Content> <!-- 另外两个依赖项目的DLL按照同样格式添加 --> </ItemGroup>
方法二:直接合并依赖项目代码(更彻底)
如果依赖项目只是内部通用代码,不需要单独维护,可以直接把它们的代码合并到主NuGet包中:
- 同样先修改依赖项目的引用配置:
<ProjectReference Include="..\LookupListCache.Common\LookupListCache.Common.csproj"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>compile</IncludeAssets> </ProjectReference>
- 在主项目的.csproj中添加打包配置,禁止自动生成依赖项声明:
<PropertyGroup> <IncludeBuildOutput>true</IncludeBuildOutput> <SuppressDependenciesWhenPacking>true</SuppressDependenciesWhenPacking> </PropertyGroup>
这样打包时,NuGet会把依赖项目的编译内容合并到主包中,同时不会生成任何外部依赖声明。
验证打包结果
打包完成后,用NuGet包浏览器打开生成的.nupkg文件,确认两点:
- lib目录下包含主项目和所有依赖项目的DLL
- .nuspec文件中没有
<dependencies>节点(或没有那些依赖项目的条目)
内容的提问来源于stack exchange,提问作者Yulian Dimitrov
相关产品推荐
相关产品推荐

