2013-03-06 70 views
0

我不确定问题的标题是否正确,但请阅读问题。为什么我们需要依赖管理的复杂性

我一直工作在C/C++对我的工作生活中的大部分(近11年)。我们只有C/C++源文件/头文件,并且所有依赖项都由Makefiles管理。事情很简单,易于管理。

过去1.5年我已经转移到Java域。我觉得非常恼火与任何新工作的最困难的方面是依赖经理。例如maven,leiningen,builder,sbt等等等等。当我从开源世界下载任何新东西时,只需要花费大量时间来设置编译,构建和运行环境,就可以使用它。当我使用eclipse时也是如此。为什么不能将所有的依赖关系与要下载的软件一起放置?为什么诸如maven,leiningen等的工具必须单独建立互联网来下载依赖关系。我知道maven构成一个本地存储库,并且应该能够在本地找到依赖关系,因为它总是下载整个互联网,但为什么会使用这个模型。我位于防火墙之后,并非一切都可以访问,并且这些工具无法下载依赖关系。我相信在大多数工作环境中都存在同样的情况。

最近,我开始使用Clojure,和男孩它已经为Clojure的获得日食配置有疼痛感。 Leiningen应该是一些必须用于任何clojure开发的魔法。有时候感觉学习leiningen比学习clojure概念更重要。我为leiningen下载了所谓的“独立”jar文件,因为“自我安装”不适合我。但它骗了我。只要我运行'lein'命令它正在互联网连接,并试图下载一些东西。为什么?它甚至不会打印帮助菜单,而无需连接互联网。为什么?我不能绕过我的互联网防火墙来满足它的要求,因为我不知道,也没有人能告诉我这个家伙想要什么。根本没有别的办法。

而且每个人似乎都在发明自己的。 Java有蚂蚁,这很简单,去了Maven,一些项目使用基于Ruby的Builder,Clojure有leiningen,Scala有。去有别的东西。为什么?为什么我们需要在一个已经充满复杂性的世界中增加复杂性。为什么不能有一个工具。

所有您在Java技术方面的专家,请原谅我的咆哮。我相信这个问题将会由于一些不努力去理解事情的人而被低估和封闭。但请相信我,我已经花了足够的时间与这种不必要的复杂性作斗争。

我只是想知道别人是如何解决这个问题,或者我是唯一一个不幸面临这些问题。

+4

“我确信这个问题将会由于一些不努力去理解这些事情的人而被低估和关闭”。我们回答具体的问题。我相信这是很痛苦的,但是你需要将你的问题形成一些有可能被回答的问题。这,不能。 – Dmitry 2013-03-06 10:05:38

+0

问题是为什么我们需要这种复杂的依赖关系管理,而且我是唯一面临这些问题的人。如果其他人正面临这些问题,这件事可以做些什么。谢谢你的评论。 – weima 2013-03-06 10:13:11

+0

有许多问题可以解决,但太多问题无法解决。例如,如果您尝试在不包含的情况下使用std :: cout <<字符串,则C++会吐出垃圾。再次,这更像是一个哲学问题,复杂性在这里停留。 – Dmitry 2013-03-06 10:15:21

回答

2

我想这个问题不能接受答案。我虚心向你提供元素,希望他们能帮助你对问题有一些了解。

主要有2个问题我认同的Java构建系统:

  • 他们中的一些声明,而别人都在用脚本
  • 的Java工具用于建筑碎片和行使控制依赖于人和Java领域的管理,而不是技术选择。

Maven是以标准方式使用形式语法定义构建方法的重中之重。你的朋友。xml文件包含的不仅仅是你的构建:它是你的工件,项目元数据,模块和插件的身份。它特别关注依赖和声明的声明。 Maven是声明式的。

对于特定人群的程序员来说,这很好,而且他们不会经常创建新项目。它随着时间的推移运行良好,它很好地巩固了构建。

Ant是一个不同的系统,您可以定义将按特定顺序链接执行的任务。所有定义都是使用XML制作的,实际上,您正在编写脚本并声明它们将如何拼接在一起。构建者(完全公开:我是一个提交者)是一种构建系统,它创建于处理声明式方法效率低下的沮丧情况,这种情况下构建需要做额外的步骤和复杂的测试以及刚性为构建使用XML。它是基于脚本的,通过配置实施约定(期望几个很好的默认设置,但是如果你需要改变的话可以让你开车)。

我对Gradle和SBT并不熟悉,但我认为他们扩展并基于这种方法,从我所听到的。

因此,这给你我希望更好地了解构建工具的景观。

没有标准构建工具出现的原因可能与Sun没有推出Java的原因有关。最终,我认为他们采用了Ant(我有一些大多数JSR jar都是用它构建的)。在这个领域还有一些产品扩展了这些构建系统;在维护代码的人之间总是会有巨大的差异,而不是在旁边。人们争辩说,嗯,人们争论不休。构建系统是启动火焰战争的好方法。我们很难同意一个标准,但现在一些常见的元素现在可以很好地解决Maven的工件问题。

而对于需要在下载Internet一遍又一遍,这是一个相当长的故事,但这里有可能触发不必要的下载需要的几件事情:

  • 任何依赖的使用SNAPSHOT会尝试获取最新的快照。这是一个伟大的计划,但它收费。你可能依赖于依赖快照的东西,并因此而下载。

  • Maven不会重新下载工件,但有时会检查md5。这很容易解决,只需使用命令行中的-O选项即可。

像Buildr这样的工具是围绕这个问题一劳永逸地构建的。首先,你只下载你所说的话。其次,除非你提出要求,否则不会再有联系。默认情况下,Buildr不会玩传递依赖关系游戏,虽然你可以问它,但你必须明确地做。

我希望这是内容丰富的,你在爪哇的土地之旅将变得不那么痛苦。