代码之家  ›  专栏  ›  技术社区  ›  bouvard

什么时候将依赖项与应用程序捆绑在一起(不)合适?

  •  14
  • bouvard  · 技术社区  · 17 年前

    总结

    我最近与我的一个应用程序所依赖的框架的创建者进行了一次对话。在那次对话中,他顺便提到,如果我把他的框架与我的应用程序捆绑在一起,并向最终用户交付一个我知道与我的代码一致的版本,我的生活会更简单。直观地说,我一直试图避免这样做,事实上,我一直在努力分割自己的代码,以便在不占用整个项目的情况下重新分发部分代码(即使任何人重用其中任何一部分的机会都很小)。然而,经过一段时间的思考,我还没有想出一个特别好的理由 全部 我的小依赖。我列出了一份利弊清单,希望有人能指出我遗漏的任何东西。

    • 版本的一致性意味着更容易 测试和故障排除。
    • 安装的组件更少。
    • 而不是等待他们 渗透到上游代码库中。

    缺点

    • 根据bortzmeyer的回应,无法升级单个组件存在潜在的安全问题。

    作为参考,我的应用程序是用Python编写的,我引用的依赖关系是“轻”的,我的意思是小而不常用。(所以它们并不存在于所有机器上,甚至也不存在于所有存储库中。)当我说“打包”我的应用程序时,我的意思是在我自己的源代码树下分发,而不是使用驻留在我的包中的脚本进行安装,这样就不会有版本冲突的可能。我也只在Linux上开发,所以不用担心Windows安装问题。

    尽管如此,我也很想听听关于打包依赖性这一更广泛(与语言无关)问题的任何想法。是我遗漏了什么,还是这是一个我刚刚考虑过的简单决定?

    附录1

    8 回复  |  直到 17 年前
        1
  •  10
  •   DNS    17 年前

    如果 使用自动依赖解析系统(即setuptools)是不可行的,以及 如果 您可以在不引入版本冲突的情况下做到这一点。你仍然需要考虑你的申请和你的受众;严肃的开发人员或爱好者更有可能希望使用特定(最新)版本的依赖关系。捆绑东西可能会让他们很恼火,因为这不是他们所期望的。

    但是,尤其是对于应用程序的最终用户来说,我严重怀疑大多数人是否喜欢搜索依赖关系。就拥有重复副本而言,我宁愿多花10毫秒下载额外的千字节,或者花一分钱在额外的兆磁盘空间上,也不愿花10多分钟搜索网站(可能已关闭)、下载、安装(如果版本不兼容,可能会失败)等。

    我不在乎我的磁盘上有多少个图书馆的副本,只要它们不会相互妨碍。磁盘空间真的很便宜。

        2
  •  3
  •   MrTopf    17 年前

    在将库/框架等与应用程序捆绑在一起的缺点中,一个重要的问题似乎被遗忘了:安全更新。

    大多数Web框架都充满了安全漏洞,需要频繁修补。无论如何,任何库都可能因为安全漏洞而不得不升级。

    如果你捆绑,系统管理员可能甚至不会 他们必须升级一些东西。

    因此,捆绑的问题不在于磁盘空间,而在于让旧的和危险的副本四处传播的风险。

        3
  •  3
  •   Dan Goldstein    17 年前

    你不能只依赖这些依赖关系的某个版本吗?例如,在Python中 setuptools 您可以指定它需要的确切版本,甚至可以给出一些条件,如<=>等等当然,这只适用于Python和特定的包管理器,但我个人总是首先尽量不要捆绑所有东西。通过将其作为Python蛋发布,您还将自动安装所有依赖项。

    当然,您也可以使用双向策略,只提供指向依赖项的链接来提供自己的包,但仍然以类似安装程序的方式提供完整的设置。但即便如此(在python的情况下),我建议简单地将鸡蛋与它捆绑在一起。

    有关鸡蛋的介绍,请参阅 this post of mine .

    当然,这是Python特有的,但我认为其他语言可能也有类似的打包工具。

        4
  •  3
  •   bortzmeyer    17 年前

    如果你为最终用户生产软件,目标是让客户使用你的软件。任何阻碍都是适得其反的。如果他们必须自己下载依赖项,他们可能会决定避开你的软件。你无法控制库是否向后兼容,也不希望你的软件因为用户更新了系统而停止工作。同样,你也不希望客户安装带有旧库的旧版本软件,导致系统其余部分崩溃。

    这意味着捆绑通常是可行的。如果你能确保你的软件在不捆绑依赖关系的情况下顺利安装,而且工作量更少,那么这可能是一个更好的选择。这是关于什么能让你的客户满意。

        5
  •  2
  •   Vadim Peretokin    17 年前

    对于Linux,甚至不要考虑捆绑。你并不比包管理者或打包者聪明,每个发行版都有自己的方式——如果你试图走自己的路,他们不会高兴的。充其量,他们不会费心打包你的应用程序,这并不好。

    请记住,在Linux中,依赖关系会自动为您拉入。这不是让用户得到它们的问题。它已经为你完成了。

    对于窗户,请随意捆绑,你一个人在那里。

        6
  •  1
  •   jro    17 年前

    这只是我的经验,对此持保留态度。

    我更喜欢我编写的几个开源库,因为它们尽可能独立于其他库。原因是,我不仅要与我的库一起分发其他库,而且还必须更新我的应用程序以确保兼容性,因为其他库也在更新。

    从我使用的其他带有“公共”库依赖关系的库中,我总是需要在我的系统上使用多个版本的公共库。我使用的利基库的相对更新速度并不快,而普通库的更新频率要高得多。版本地狱。

    但这只是泛泛而谈。如果我现在可以通过引入依赖关系来帮助我的项目和用户,我总是会考虑该决定的下游和后期影响。如果我能管理它,我可以自信地包括依赖性。

    与往常一样,您的里程数可能会有所不同。

        7
  •  1
  •   Daniel Von Fange    17 年前

        8
  •  1
  •   Pontus Gagge    17 年前