我们需要做的是能够找到一个一致的解决方案来创建包含多个包的单个包(我们称之为主包),检查这些包是否彼此兼容并对它们进行版本控制。
我们需要一起发布的软件包有很多(15+),并且基于不同的技术,其中许多软件包相互依赖,因此将它们合并到一个存储库中并不是一个可能的解决方案。
我们需要考虑用于 CI/CD/Artifacts 的工具的最终限制,即 Azure Devops 和 Yaml 管道。
目前,我们正在为每个要发布的组件生成一个通用包,并且我们正在使用 gitflow 和 semver(x.y.z 版本)对它们进行版本控制。
现在的主要问题是试图找到一种方法以简单的方式将所有这些部分组合在一起并管理这些部分的兼容性。
这些包的分发超出了这个问题的范围,我们只需要创建包含所有内容的包,安装/分发过程已经就位。
目前流程是这样的。
对于每个组件,我们正在创建一个具有 x.y.z 版本的通用包。
当我们想要创建主包(也是通用包)时,我们在 Azure Devops 上有这个管道,其参数是每个组件的所有版本,默认情况下下载包的最新版本(使用“*”通配符,因此它不支持包含破折号的版本,仅支持 x.y.z)。使用latest作为默认参数使管道易于每个人运行。
这种方法的问题在于:
我想到的一些解决方案
CalVer YYYY.MM.Build 来对主包进行版本控制,因为这是一个独立的系统。
为了解决兼容性问题,我们可以为每个组件编写一个清单文件,并在其中定义对其他组件所需版本的约束。示例:
如果组件 C 依赖于 B 并且 B 依赖于 A
在C的清单文件中我们说B必须是1.*,在B的清单文件中我们说A必须是2.0.0
为了解决用户体验的问题,我们可以创建一个外部门户,这样我们就可以创建某种下拉列表,以便于版本选择(市场上已经有解决方案来解决这个问题了吗?)。在此解决方案中,我们还可以集成对清单文件的检查,这样我们就可以事先查看主包本身是否一致。
我认为解决用户体验问题的另一个解决方案是创建一个单独的存储库,在其中编写一个清单文件,在其中定义要打包在一起的所有包及其版本,并以某种方式将其传递到管道。通过这种方式,我们解决了必须检查 foreach 运行 azure 工件提要的问题,但我们仍然需要进行大量手动处理,并且它没有提供检查包兼容性的解决方案(除了在管道本身)。
NuGet
npm
、Maven
、Python
等)。
默认情况下,这些包管理器通常不能相互包含/组合。