同一个解决方案中的项目如何引用Nuget包的解决方案

7
我有一个包含多个项目的解决方案,这些项目都要共享给我的组织使用作为通用Nuget软件包。这个解决方案被一个git仓库包含,我们使用TeamCity运行构建,但我们并不是非常先进,我们需要手动启动Teamcity构建,以便在解决方案中的给定项目生成/发布新的Nuget软件包,每个项目都有自己的TeamCity构建配置。
构建后,项目通过标签.csproj <project/>生成Nuget软件包:GeneratePackageOnBuild,我们还通过version标签控制版本号,该标签是由TeamCity构建属性填充的。这很好用。我们遇到问题的地方是管理项目对它们自身的引用/依赖项。我似乎无法正确理解如何做到这一点。例如:
-- Solution
----- Project A v1.0.6
----- Project B v1.0.1

项目A(v1.0.6)依赖于项目B(v1.0.1)。假设我同时更改了项目A(v1.0.7)和项目B(v1.0.2)。由于项目B尚未构建完成,因此我不能让项目A引用项目B的NuGet软件包,所以我使用了项目引用。但是,这会导致Package A(v1.0.7)的NuGet软件包认为它具有与项目B(v1.0.2)相同的构建编号,实际上并非如此。因此,当有人使用项目A时,他们会被告知要查找不存在的依赖项项目B的版本(例如v1.0.7)。为解决此问题,在项目A的 .csproj 中添加了以下内容: <ProjectReference Include =“..\ Company.ProjectB \ Company.ProjectB.csproj” ExcludeAssets =“All” /> 然而,现在消费者不知道项目B的依赖关系(因为它不再出现在Nuget软件包依赖项中),并且当他们发现需要它时,他们将在使用项目A时收到运行时错误,表明它仍在寻找项目B v1.0.7,而此版本显然不存在。
那么,在生成没有nuspec的NuGet软件包时,如何智能处理项目引用?我希望尽可能少的手动干预。
我唯一的其他解决方案是使用Nuget软件包引用,但这意味着在开发人员可以开始处理项目A之前,必须先构建和部署项目B。

这里也有一个类似的问题,但没有解决方案:https://stackoverflow.com/questions/51713678/nuget-references-within-same-solution - S1r-Lanzelot
这些是什么类型的项目?如果您只有对解决方案中项目的引用,而且所有项目都使用“PackageReference”作为NuGet引用的格式,那么您应该没问题。 - Martin Ullrich
如果没有,请提供一个完整的、可验证的示例解决方案来重现您的问题。 - Martin Ullrich
@ziv,你是正确的。这基本上就是我意识到的。我把小事变成了大问题。我想我可能会关闭这个问题,因为已经有一个重复的(未回答)问题存在。谢谢。 - S1r-Lanzelot
如果您需要在同一代码库中的多个项目中使用相同的NuGet版本,请参阅我的此处的答案 - lonix
显示剩余2条评论
1个回答

4
设计上,当您打包一个具有项目引用的项目时,这些依赖项目会作为NuGet依赖项添加,其最小版本是每个项目在打包时的当前版本。要理解为什么是这样,请想象一下您对ProjectB进行了重大更改,并修复了ProjectA以使其与之配合使用。如果您发布了ProjectA,但使用旧版本的ProjectB作为NuGet依赖项,则ProjectA的NuGet用户将在运行时崩溃,因为他们使用的ProjectB版本不兼容。NuGet无法知道这一点。
因此,如果您想增加ProjectA的版本而不增加ProjectB的依赖版本,请分别进行提交。否则,同时发布ProjectA和ProjectB的新版本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接