Nuget 多项目复合打包

2023-06-02,,

问题描述

我这里有个进程间通信组件,用于提供多应用间通信的解决方案。

进程间通信,分为客户端和服务端,俩端肯定会有些共性代码,所以加了个H3C.Channel.Core项目

因为之前还不太了解nuget这块,然后我就踩到了坑:

引用H3C.Channel.Client包后,H3C.Channel.Core代码竟然没有默认打包到Client的Nuget包内部。

当时项目忙,没时间关注这块,就临时搞了个H3C.Channel.Core包,所以进程间通信就有三个Nuget包

但用一段时间,会发现真的烦。。。每次都要更新3个nguet包(程度员是最不喜欢重复工作量的)

今天终于有时间看这个心病。好像是可以解决的,emmm。。。我整理了下

集成多项目Nuget包-内部引用的项目

所以,集成多项目Nuget包-内部引用的项目,可以有以下几种处理:

一般都是维护内部项目H3C.Channel.Core的Nuget版本,加个nuget配置即可,如何修改csporj,可以参考:Github自动打包并推送Nuget版本 - 唐宋元明清2188 - 博客园 (cnblogs.com)

不想维护内部项目H3C.Channel.Core的Nuget版本,可以设置H3C.Channel.Core项目的配置<GeneratePackageOnBuild>false</GeneratePackageOnBuild>,让H3C.Channel.Core不生成Nuget包。

设置H3C.Channel.Client项目的配置:

 1 <Project Sdk="Microsoft.NET.Sdk">
2 <PropertyGroup>
3 <TargetFrameworks>net452;</TargetFrameworks>
4 <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
5 <Version>1.1.16-preview</Version>
6 <Authors>Kybs0</Authors>
7 <RepositoryUrl>http://10.214.20.41:81/windowsappgroup/WindowsComponents/H3C.Channel</RepositoryUrl>
8 <RepositoryType>git</RepositoryType>
9 <Description>进程间通信-客户端</Description>
10 <LangVersion>latest</LangVersion>
11 <Company>H3C</Company>
12 <Configurations>Debug;Release</Configurations>
13 </PropertyGroup>
14 <PropertyGroup>
15 <TargetsForTfmSpecificBuildOutput>CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
16 </PropertyGroup>
17 <Target Name="CopyProjectReferencesToPackage">
18 <ItemGroup>
19 <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))" />
20 </ItemGroup>
21 </Target>
22 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
23 <DocumentationFile>H3C.Channel.Client.xml</DocumentationFile>
24 </PropertyGroup>
25 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
26 <DocumentationFile>H3C.Channel.Client.xml</DocumentationFile>
27 </PropertyGroup>
28 <ItemGroup>
29 <None Remove="H3C.Channel.Client.csproj.DotSettings" />
30 </ItemGroup>
31 <ItemGroup>
32 <ProjectReference Include="..\H3C.Channel.Core\H3C.Channel.Core.csproj">
33 <PrivateAssets>all</PrivateAssets>
34 </ProjectReference>
35 <ProjectReference Include="..\websocket-sharp\websocket-sharp.csproj">
36 <PrivateAssets>all</PrivateAssets>
37 </ProjectReference>
38 </ItemGroup>
39 </Project>

俩个重点:

1. CopyProjectReferencesToPackage

build 出来的 dll 程序集文件打包进 nupkg 文件

这个配置决定了,外部是否可直接引用到内部项目中的类文件。

2.PrivateAssets- 引用所有资产文件

这个必须要的,将内部项目的源码类文件全部引用。不然最终生成的Nuget包无法安装,提示“无法解析H3C.Channel.Core”

我们尝试下,生成新的nuget看看。通过VS查看测试类ChannelDemoTest,反编译后dll的位置,是okay的:

减少打包依赖后,减少了后续的维护成本(重复工作):

引用H3C.Channel.Client后会默认引用H3C.Channel.Core包:

Nuget 多项目复合打包的相关教程结束。

《Nuget 多项目复合打包.doc》

下载本文的Word格式文档,以方便收藏与打印。