问题描述
我这里有个进程间通信组件,用于提供多应用间通信的解决方案。
进程间通信,分为客户端和服务端,俩端肯定会有些共性代码,所以加了个H3C.Channel.Core项目
因为之前还不太了解nuget这块,然后我就踩到了坑:
引用H3C.Channel.Client包后,H3C.Channel.Core代码竟然没有默认打包到Client的Nuget包内部。
当时项目忙,没时间关注这块,就临时搞了个H3C.Channel.Core包,所以进程间通信就有三个Nuget包
但用一段时间,会发现真的烦。。。每次都要更新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项目的配置:
项目引用的生成文件复制操作(以下复制即可):
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的:
减少打包依赖后,减少了后续的维护成本(重复工作):
引用H3C.Channel.Client后会默认引用H3C.Channel.Core包:
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>
没有这个配置后,外部无法引用H3C.Channel.Core的类文件,封装性会更好。