我实际上正在开发客户端依赖于需要从存储库服务器下载的模块的应用程序。模块可以是任何存档:jar、dll、zip 等。
客户端首先将一组属性(服务器已经定义好的一组Key-Value)提交给repository server。服务器根据这些属性进行一些计算,并返回与客户端对应的所有模块。如果客户端需要一个过时的模块,服务器会将最新的模块发送给客户端,以便它可以更新它。服务器还需要计算模块之间的依赖关系并将它们发送到客户端,如 maven。
但是,主要困难是我不能对客户端发送的属性做出假设,因为它们是特定于客户端环境的。
我的第一个想法是创建一个矩阵,其中每一列代表一个属性,每一行代表一个模块。在矩阵中,可以添加和删除属性。对于矩阵中的每种情况,我将添加与该模块对应的值。
例如,假设我有 2 个模块和一组属性{OS, Archive, Arch, Version, .Net}
。对于 module1,值为{OS="Windows 7", Archive="dll", Arch=32-bits, Version="2.0.0",.net=3.5}
. 对于模块 2,值为{OS="Windows 7", Archive="jar", Version="2.1",.net="4.0"}
但是,如果每个属性只包含一个值,这种情况就非常适用。如果客户说我想要所有在 Windows 7 (module1
和module2
) 上运行的模块,并且在 a 但是dll
存档支持 .net 3.5 的上级版本,. module1
将被退回。
这是完美的工作。
但是如果每个属性都可以包含多个值(这是我们的例子)。例如,在我们之前的示例中,如果 module1 可以在 Windows 7、Vista、XP 中运行。对于 OS 属性,我必须查找客户端发送的每个属性并搜索正确的值。那是组合计算。
我在这个过程中看到的非常类似于一个包管理系统,比如apt、yum。
解决这个问题的更好方法是什么?