如何将.NET 7 Proxy项目打包为包含依赖的单NuGet包?
如何将Proxy项目及依赖项打包为单个NuGet包
针对你的需求,完全可以把Proxy(Project 2)、API contracts(Project 3)和Infrastructure(Project 1)的必要代码打包成单个NuGet包,不用拆分多个独立包,下面是几种可行方案:
方案1:用ILRepack合并程序集
这是最直接的方式,打包时把依赖的程序集合并到Proxy的程序集里:
- 给Proxy项目安装
ILRepack.Lib.MSBuild.TaskNuGet包 - 编辑Proxy项目的
.csproj文件,添加以下配置(放在<Project>节点内):
<Target Name="ILRepack" AfterTargets="Build"> <ILRepack OutputType="Library" MainAssembly="$(OutputPath)$(AssemblyName).dll" OutputAssembly="$(OutputPath)$(AssemblyName).dll" InputAssemblies="$(OutputPath)xxx.Infrastructure.dll;$(OutputPath)xxx.APIContracts.dll;$(OutputPath)$(AssemblyName).dll" DebugInfo="true" CopyAttributes="true" AllowDuplicateResources="true" /> </Target>
- 打包NuGet包时,生成的程序集已经是合并后的,其他应用引用这个包就不会再依赖额外的程序集。
注意:如果依赖项里有强命名的程序集,需要处理签名问题;另外如果依赖项还有其他外部NuGet依赖,这种方式只适合合并你自己的项目程序集。
方案2:把依赖项目的代码嵌入Proxy项目
如果你的Infrastructure和API contracts代码量不大,可以直接把代码嵌入Proxy项目:
- 右键Proxy项目 → 添加 → 现有项,选择Infrastructure和API contracts里的所有代码文件,添加时选择「添加为链接」(避免复制代码冗余)
- 确保这些链接文件的「生成操作」设置为「编译」
- 这样打包Proxy项目时,这些依赖代码会直接编译到Proxy的程序集里,自然不会有外部依赖问题。
如果是.NET 5+,也可以用**共享项目(Shared Project)**重构:把Infrastructure和API contracts的代码移到共享项目,然后让Proxy项目引用这个共享项目,打包时共享项目的代码会直接编译进Proxy程序集。
方案3:通过NuGet配置嵌入依赖项
编辑Proxy项目的.csproj,调整对Infrastructure和API contracts的引用配置,让NuGet打包时把这些依赖的程序集包含进去:
- 确保Proxy项目对Infrastructure和API contracts的引用是
ProjectReference,然后修改引用配置:
<ProjectReference Include="..\xxx.Infrastructure\xxx.Infrastructure.csproj"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </ProjectReference> <ProjectReference Include="..\xxx.APIContracts\xxx.APIContracts.csproj"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </ProjectReference>
- 然后在
.csproj里添加NuGet打包配置,确保依赖程序集被包含:
<PropertyGroup> <IncludeBuildOutput>true</IncludeBuildOutput> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> </PropertyGroup> <ItemGroup> <None Include="$(OutputPath)xxx.Infrastructure.dll" Pack="true" PackagePath="lib\$(TargetFramework)" /> <None Include="$(OutputPath)xxx.APIContracts.dll" Pack="true" PackagePath="lib\$(TargetFramework)" /> </ItemGroup>
这样打包出来的NuGet包会包含Proxy、Infrastructure和API contracts的程序集,其他应用安装后会自动把这些程序集复制到输出目录,不会报找不到依赖的错误。
内容的提问来源于stack exchange,提问作者Jules
相关产品推荐
相关产品推荐

