Ruby on rails 什么';使用一个有很多依赖关系的框架有什么不对?

Ruby on rails 什么';使用一个有很多依赖关系的框架有什么不对?,ruby-on-rails,frameworks,dependencies,catalyst,Ruby On Rails,Frameworks,Dependencies,Catalyst,我最近告诉一位朋友,我开始学习Catalyst(Perl),他非常强调,因为Catalyst有如此多的依赖项,所以我应该改用Rails之类的东西 有很多依赖关系,这不是一件好事吗?这不意味着大量代码被重复使用吗?我知道安装框架可能需要更多的努力,但是还有其他缺点吗 我将继续我的演讲,直到我得到一些有趣的回答。:-) 当组件之间存在版本依赖关系时,如果您在依赖组件的兼容版本可用之前被迫升级一个组件(例如,出于安全原因),您可能会发现自己陷入了非工作状态 这首先假设您可以进入工作状态。可能是,如果您

我最近告诉一位朋友,我开始学习Catalyst(Perl),他非常强调,因为Catalyst有如此多的依赖项,所以我应该改用Rails之类的东西

有很多依赖关系,这不是一件好事吗?这不意味着大量代码被重复使用吗?我知道安装框架可能需要更多的努力,但是还有其他缺点吗


我将继续我的演讲,直到我得到一些有趣的回答。:-)

当组件之间存在版本依赖关系时,如果您在依赖组件的兼容版本可用之前被迫升级一个组件(例如,出于安全原因),您可能会发现自己陷入了非工作状态

这首先假设您可以进入工作状态。可能是,如果您尝试使用所有依赖项的当前版本,您会发现它们不起作用

依赖项的数量越多,风险就越大

Rails也不是没有这个问题的。随着每一个新的Ruby版本的发布,人们都争先恐后地更新关于如何构建(比如)数据库驱动程序的指令


平心而论,随着时间的推移,这个问题已经趋向于“更好”,尽管道路上会出现颠簸。

我的个人经验是,依赖性越强,需要跟踪的版本越多,这可能会导致噩梦般的情况。特别是,更新一个依赖项(例如,由于您希望修复的错误)可能会带来和其他依赖项的兼容性问题。举个例子,我个人的情况是,GCC4.0.3与foo一起工作,而不是与bar(foo的依赖关系)一起工作,GCC4.0.5与bar一起工作,而不是与foo一起工作。幸运的是,4.0.2成功了


此外,更多的依赖性倾向于指出“弗兰肯斯坦怪兽”产品,这些产品由事先设计不适合一起玩的部件组成。设计了一个集成良好的框架,以实现良好的一致性。当然,这可以通过适当地包装差异来解决。

这没有什么特别的问题。催化剂的优点是它的碎片可以被不用所有催化剂的人使用。这意味着有更多的眼睛注视着关键部件,并修复其中的错误

我听到的最大的抱怨是,在安装Catalyst时,看着所有这些消息在CPAN外壳中传递,真让人恼火。解决方案是在开始时利用操作系统的软件包管理器。在Debian上,在没有安装其他perl模块的机器上安装apt get install libcatalyst perl需要15秒。15秒。(简单的CPAN安装也不难,但我想标准的CPAN外壳会问你很多愚蠢的问题,这会让新手望而却步。)


不要担心依赖关系,有很好的工具来管理它们,它们使框架更强大、更灵活。

这是我以前在帖子中看到的主题。我一直想写一篇关于它的文章,现在终于这样做了

在这里:

我鼓励你读它。不过,要点很简单。这个问题是错误的。这不是“你使用的应用程序或框架有很多依赖关系,还是没有依赖关系?”

它是:“您使用的应用程序或框架有很多外部依赖关系,还是试图在内部完成所有工作?”


接下来的问题是“你真的相信编写这个框架的人了解处理web请求所需完成的每项任务的每一个细微细节吗?”

Rails的问题其实并不在于依赖项的数量——除了它的组成框架,它只取决于耙。理论上是正确的,但不适用于催化剂。Catalyst的大多数CDependency是专门为Catalyst编写的,并且由维护Catalyst::Runtime的同一组维护。如果某个依赖项出了问题并破坏了其他依赖项,我们将同时释放所有内容。然而,这从未发生过。@Chuck,如果你读他的帖子,你会注意到他在谈论数据库驱动程序之类的事情。当然,Rails可能不依赖于数据库驱动程序,但我敢打赌你的应用程序依赖于数据库驱动程序。另外需要注意的是,Perl模块版本通常是非常向后兼容的——因此Catalyst不依赖于某个::模块版本3,而是依赖于某个::模块版本>=3。另一方面,这意味着,虽然Catalyst安装有许多模块组合,但不能保证您的组合以前已经尝试过。另一方面,Catalyst及其所有依赖的Perl模块都附带了大量的测试,这些测试在安装时会自动运行,这是Ruby/Rails人员的另一个观点示例,他们不了解Perl/CPAN的高级功能以及它们与Catalyst的关系。Catalyst的所有部分都是为了相互集成而设计的。它们也被设计为可以自己使用。Perl的模块测试使这种情况不太可能发生,并且在发生这种情况时,更容易报告为bug。@jrockway:设计目标和现实往往是分开的。我确信这不会让任何人夜以继日,但很难找到这个问题的答案。谢谢你们所有人!我决定坚持我关于CPAN的Catalyst教程,我订购了两本Catalyst书籍(来自betterworldbooks.com)。谢谢你的信心提升,Rockway先生!非常有用的文章!谢谢,杰克。