让我们考虑一个场景,在该场景中,我们要公开两个.NET Standard项目并为其创建NuGet包:
图书馆解决方案
ClassLibrary1(CL1)
∟ClassLibrary2(CL2)
重要的是要提到CL1与CL2具有ProjectReference。
NuGet的文档指出,理想情况下,我们应该使用一个程序集生成一个包,因此我们为每个包创建一个NuGet包。
当我们需要在LibrarySolution的范围内确定CL1中需要哪个版本的CL2时,就会出现问题,因为我们有直接的项目参考。
我想到以下两种方法:
在解决方案中维护项目引用,这意味着我们需要将程序包版本存储在csproj文件中,提交版本更改等,以便版本约束和依赖性要求正确(我们目前在CI管道和当前版本中处理版本控制)版本存储在此处而不是代码中)。
将对CL2的依赖关系转换为PackageReference。这样,CL1将始终依赖于已发布的CL2版本。但是,这样做将意味着围绕发布和更新NuGet软件包(批准PR,合并,CI等)进行所有操作,这可能会非常耗时。
我认为选项1更好,但还是有点手动。是否有解决此问题的最佳方法?我宁愿不要使用包来引用位于相同解决方案内部的项目,因为这会导致不必要的间接访问。
最佳答案
首先,使用ProjectReference
可以正确执行操作。同一解决方案中的两个项目甚至没有理由知道另一个软件包的存在。
现在,由于您在同一解决方案中拥有CL1和CL2,我想CL1需要CL2的最新版本。
考虑到前一个因素,您只需添加以下内容即可生成构建包:<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
标签,MSBuild会将其更改为对包中最新版本的NuGet依赖项。