我实际上正在处理客户端依赖于需要从存储库服务器下载的模块的应用程序。这些模块可以是任何压缩文件:jar,dll,zip等。如何实现依赖/包管理系统?
客户端首先向存储库服务器提交一组属性(服务器已经定义的一组键值)。服务器根据这些属性进行一些计算并返回与客户端相对应的所有模块。如果客户端需要一个过期的模块,服务器会将最新的模块发送给客户端,以便它可以更新它。服务器还需要计算模块之间的依赖关系,并将它们发送给客户端,比如maven。
但是,主要困难是我无法对客户端发送的属性做出假设,因为它们是特定于客户端环境的。
我有的第一个想法是有一个矩阵,其中每列代表一个属性,每一行代表一个模块。在矩阵中,可以添加和删除属性。对于矩阵中的每个案例,我将添加对应于该模块的值。
例如,假设我有2个模块和一组属性{OS, Archive, Arch, Version, .Net}
。对于模块1,值为{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
)上运行的模块都能运行,但其中的dll
归档文件支持.net 3.5的高级版本。将返回module1
。
这是完美的工作。
但是如果每个属性都可以包含多个值(这是我们的情况)呢?例如,在我们之前的例子中,如果module1可以在Windows 7,Vista,XP中运行。对于操作系统属性,我将不得不为客户端发送的每个属性寻找正确的值。这是一个组合计算。
我在这个过程中看到的与包裹管理系统非常相似,如apt,yum。
这个问题的更好方法是什么?
如果这是一个桌面应用程序,我会说[Java Web Start的(http://stackoverflow.com/tags/java-web-start/info)是你应该看看。 – 2013-04-29 13:47:20
看起来非常类似于此:http://stackoverflow.com/questions/15896591/algorithm-to-resolve-version-scope-based-dependency/15898608#15898608 - 你可以看看maven或osgi以及它们是如何工作的与 – SpaceTrucker 2013-04-29 13:50:12
@SpaceTrucker是啊,谢谢,我目前正在观看可满足性问题及其实施 – Dimitri 2013-04-29 13:54:20