2013-04-29 40 views
2

我实际上正在处理客户端依赖于需要从存储库服务器下载的模块的应用程序。这些模块可以是任何压缩文件: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(module1module2)上运行的模块都能运行,但其中的dll归档文件支持.net 3.5的高级版本。将返回module1

这是完美的工作。

但是如果每个属性都可以包含多个值(这是我们的情况)呢?例如,在我们之前的例子中,如果module1可以在Windows 7,Vista,XP中运行。对于操作系统属性,我将不得不为客户端发送的每个属性寻找正确的值。这是一个组合计算。

我在这个过程中看到的与包裹管理系统非常相似,如apt,yum。

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

+1

如果这是一个桌面应用程序,我会说[Java Web Start的(http://stackoverflow.com/tags/java-web-start/info)是你应该看看。 – 2013-04-29 13:47:20

+2

看起来非常类似于此:http://stackoverflow.com/questions/15896591/algorithm-to-resolve-version-scope-based-dependency/15898608#15898608 - 你可以看看maven或osgi以及它们是如何工作的与 – SpaceTrucker 2013-04-29 13:50:12

+0

@SpaceTrucker是啊,谢谢,我目前正在观看可满足性问题及其实施 – Dimitri 2013-04-29 13:54:20

回答

0

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

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

+0

同意这听起来很像搜索问题。这听起来像他只需要索引元数据,所以你可以运行Solr或Elasticsearch开箱即可使用精简的前端执行此操作,以便从磁盘提供二进制文件。 – 2013-07-02 08:49:05

+0

这就是我的想法。如果这个指数很小,那么solr可能会过度杀伤,但如果这个指数会有相当大的规模,那么solr可能是个不错的选择。 – digitaljoel 2013-07-02 15:37:27

+0

只要有一个索引,只要有一个线程写入到Lucene,就可以工作。 – 2013-07-02 19:14:47

0

我想你需要一个匹配系统,返回模块匹配一些属性。你可能会考虑一个标签系统,一个模块有一些标签,每个标签对应一个属性。例如:module1 {OS =“Windows 7”,Archive =“dll”,Arch = 32位,Version =“2.0.0”,.net = 3.5}有4个标签:OS =“Windows 7”,Archive = dll“,Arch = 32位,Version =”2.0.0“,.net = 3.5,你需要匹配一个模块有基于请求的标签。

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

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

+0

我推荐“Toxi”解决方案 – namthienmenh 2013-06-29 05:52:31

+0

有趣的,我会看看 – Dimitri 2013-06-29 23:12:46

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的坐标和本地回购计算的路径,下载如果不是本地存在。然后它看着jar中的属性文件,它给了它一个其他jar的列表。然后客户端下载那些不存在的,然后设置类路径并运行代码。

好吧,为我工作的东西,现在回到@Dimitri。

首先,它不是从你的问题,你是把它当作依赖关系的树清晰。习惯用树来思考。看看property graphs,感受他们。

而且,你的问题建议这将是要求服务器计算的依赖,而它通常做这个计算客户端,客户端和服务器只是提供元数据和二进制文件。

你说:

但如果每个属性可以包含多个值(这是我们 情况)什么。例如,在我们之前的例子中,如果module1可以在Windows 7,Vista,XP中运行 。对于操作系统属性,我将不得不为每个由客户端发送的 属性去搜索正确的值。这是一个 组合计算。

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

当它需要匹配各个版本的范围时,它变得复杂。理想情况下,如果你能避免它更好。 Maven确实是support version ranges,但我从不需要使用它。