2

我实际上正在开发客户端依赖于需要从存储库服务器下载的模块的应用程序。模块可以是任何存档: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 (module1module2) 上运行的模块,并且在 a 但是dll存档支持 .net 3.5 的上级版本,. module1将被退回。

这是完美的工作。

但是如果每个属性都可以包含多个值(这是我们的例子)。例如,在我们之前的示例中,如果 module1 可以在 Windows 7、Vista、XP 中运行。对于 OS 属性,我必须查找客户端发送的每个属性并搜索正确的值。那是组合计算。

我在这个过程中看到的非常类似于一个包管理系统,比如apt、yum。

解决这个问题的更好方法是什么?

4

3 回答 3

0

首先,我同意一些评论者的观点,即这是一个已解决的问题。如果你能抽出时间,调查一下现有的方法;maven, ivy, yumm, gem, rpm, apt-get, gentoo, mac homebrew, perl cpan, cygwin, haskel cabal, python easyinstall, java web start。然后分类成一组方法,然后列出每种方法的优缺点。

我需要实现这样一个系统,对我来说,maven 方法效果很好。但我没有使用纯 maven,因为确定客户端上的传递依赖树有点复杂。相反,我在构建时使用 maven-dependencies-plugin 计算了依赖项列表,然后将其放入顶级 jar 内的属性文件中。

然后当客户端想要运行某些东西时,它会被赋予 maven 坐标并计算本地 repo 中的路径,如果本地不存在则下载。然后它查看了 jar 中的属性文件,它给出了其他 jar 的列表。然后客户端下载不存在的那些,然后设置类路径并运行代码。

好的,对我有用的就这么多,现在回到@Dimitri。

首先,您的问题并不清楚您是否将其视为依赖树。习惯于从树的角度思考。查看属性图以了解它们。

此外,您的问题表明客户端会要求服务器计算依赖关系,而通常是客户端进行此计算,而服务器只提供元数据和二进制文件。

你说:

但是如果每个属性都可以包含多个值(这是我们的例子)。例如,在我们之前的示例中,如果 module1 可以在 Windows 7、Vista、XP 中运行。对于 OS 属性,我必须查找客户端发送的每个属性并搜索正确的值。那是组合计算。

当然客户端只运行一个操作系统,所以你只是过滤掉操作系统不匹配的所有依赖项?

当您需要将版本范围相互匹配时,情况会变得复杂。理想情况下,如果您可以避免这种情况,那就更好了。Maven 确实支持版本范围,但我从来不需要使用它。

于 2013-07-02T21:16:29.077 回答
0

我想知道您是否可以设置 solr 来索引元数据并返回二进制文件以获取搜索结果。然后,您只需使用限制进行搜索,即可从 solr 检索适当的二进制“文档”。

设置 solr 可能需要一些工作,但与创建自己的存储库管理器相比,它的工作量可能会更少(并且更不容易出错)。听起来有些人使用 Tika 来索引二进制文件(图像、pdf、文档),这与 dll 或 jar 应该没有什么不同。例如,请参阅这个问题SOLR - Tika - Store binary version of file以获取有关如何返回二进制库的提示。

于 2013-06-26T15:37:26.893 回答
0

我认为您需要一个匹配系统,该系统返回的模块与某些属性匹配。你可能会考虑一个标签系统,一个模块有一些标签,每个标签对应一个属性。例如:module1 {OS="Windows 7", Archive="dll", Arch=32-bits, Version="2.0.0",.net=3.5} 有 4 个标签:OS="Windows 7", Archive=" dll", Arch=32-bits, Version="2.0.0", .net=3.5 并且您需要根据请求匹配具有标签的模块。

你可以在这里看到一个完整的数据库系统实现和查询

http://tagging.pui.ch/post/37027745720/tags-database-schemas

于 2013-06-29T05:51:21.777 回答