0
点赞
收藏
分享

微信扫一扫

Nuget 多项目复合打包

云岭逸人 2022-12-20 阅读 96

问题描述

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

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

Nuget 多项目复合打包_C#

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

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

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

Nuget 多项目复合打包_C#_02

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

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

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

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

1.维护内部项目H3C.Channel.Core的Nuget版本

加个nuget配置即可,如何修改csporj,可以参考:​​Github自动打包并推送Nuget版本 - 唐宋元明清2188 - 博客园 (cnblogs.com)​​

2. 不想维护内部项目H3C.Channel.Core的Nuget版本,需要暴露其中类ChannelDemoTest给用户使用

设置H3C.Channel.Core项目的配置<GeneratePackageOnBuild>false</GeneratePackageOnBuild>,让H3C.Channel.Core不生成Nuget包。

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

Nuget 多项目复合打包_进程间通信_03

项目引用的生成文件复制操作(以下复制即可):

Nuget 多项目复合打包_Core_04

Nuget 多项目复合打包_类文件_05

1 <Project Sdk="Microsoft.NET.Sdk">
2 <PropertyGroup>
3 <TargetFrameworks>net452;</TargetFrameworks>
4 <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
5 <Version>1.1.1</Version>
6 <Authors>Kybs0</Authors>
7 <UseWpf>True</UseWpf>
8 <UseWindowsForms>true</UseWindowsForms>
9 <RepositoryUrl></RepositoryUrl>
10 <PackageProjectUrl></PackageProjectUrl>
11 <PackageIconUrl></PackageIconUrl>
12 <RepositoryType>git</RepositoryType>
13 <Description>进程间通信-客户端</Description>
14 <LangVersion>latest</LangVersion>
15 <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
16 <Company>H3C</Company>
17 <Configurations>Debug;Release</Configurations>
18 </PropertyGroup>
19 <PropertyGroup>
20 <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
21 </PropertyGroup>
22 <Target Name="CopyProjectReferencesToPackage" DependsOnTargets="ResolveReferences">
23 <ItemGroup>
24 <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))" />
25 </ItemGroup>
26 </Target>
27 <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net452|AnyCPU'">
28 <DocumentationFile>H3C.Channel.Client.xml</DocumentationFile>
29 </PropertyGroup>
30 <ItemGroup>
31 <None Remove="H3C.Channel.Client.csproj.DotSettings" />
32 <None Remove="H3C.Channel.Client.xml" />
33 </ItemGroup>
34 <ItemGroup>
35 <Folder Include="Properties\" />
36 </ItemGroup>
37 <ItemGroup>
38 <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
39 <PackageReference Include="System.Runtime" Version="4.3.1" />
40 <PackageReference Include="System.ValueTuple" Version="4.5.0" />
41 <PackageReference Include="websocket-sharp" Version="1.0.4" />
42 </ItemGroup>
43 <ItemGroup>
44 <ProjectReference Include="..\H3C.Channel.Core\H3C.Channel.Core.csproj" >
45 <PrivateAssets>all</PrivateAssets>
46 </ProjectReference>
47 </ItemGroup>
48 </Project>

View Code

俩个重点:

1. CopyProjectReferencesToPackage 

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

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

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

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

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

Nuget 多项目复合打包_Core_06

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

Nuget 多项目复合打包_C#_07

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

Nuget 多项目复合打包_Core_08

3. 不想维护内部项目H3C.Channel.Core的Nuget版本,也不需要暴露其中类ChannelDemoTest给外部使用 

在上面操作的基础上,隐藏这段配置就行了:

1     <PropertyGroup>
2 <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
3 </PropertyGroup>
4 <Target Name="CopyProjectReferencesToPackage" DependsOnTargets="ResolveReferences">
5 <ItemGroup>
6 <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))" />
7 </ItemGroup>
8 </Target>

Nuget 多项目复合打包_C#_09

 没有这个配置后,外部无法引用H3C.Channel.Core的类文件,封装性会更好。

 

举报

相关推荐

0 条评论