【问题标题】:How to handle dependency source version issues如何处理依赖源版本问题
【发布时间】:2017-12-15 02:14:51
【问题描述】:

如果一个项目依赖一些库,基本上有两种选择:

  1. 在众所周知的全局路径中找到库(如/usr/src/linux-headers-4.13.0-1-amd64/
  2. 将源代码复制到项目文件夹中。

使用全球定位方法需要最少的空间和时间(下载时间)。如果依赖项版本控制良好(标记为v3.1v3.1.1 等),则此选项效果很好。

如果我们的项目需要使用库的最新提交,版本控制不是一个选项。如果我们只是将最新的提交拉到众所周知的位置并让我们的项目使用该库,那么我们很可能在 6 个月后无法编译我们的项目,这是不可接受的。

如果我们将依赖项作为子项目添加到我们的项目中,我们将始终能够编译我们的项目。这是最安全的方法。问题是如果库在 100MB 左右,将源复制到项目文件夹中只是浪费磁盘使用、下载时间等......

人们如何处理这个问题?

【问题讨论】:

    标签: dependency-management


    【解决方案1】:

    你不能一边吃蛋糕一边吃:

    • 要么您将依赖一个稳定的版本库,然后引用它(无论它位于何处)

    • 或者您将始终依赖“最新和最伟大的” - 然后引用它的副本

    磁盘空间并不是真正的问题 - 显然,您需要在您的开发人员机器上至少有一个您正在使用的 lib 的本地副本,如果它是“正确的版本化”代码或“树干头”。当它始终是“主干”时,您可能会使用一些版本控制系统(如 git 或 svn)来获取库,因此每当您更新本地副本时,您只会从 repo 中提取更改,而不是“完整100 MB”。

    但是,为了使您的构建可重现,对于每个版本的源代码,您应该将所有依赖项连同源代码一起版本化。如果您使用的是第三方库,则可以

    • 依靠供应商为您提供您在项目期间使用的版本,并期望他们在未来 10 年左右为您提供这些版本

    • 或者,保留您自己使用的第三方库的每个版本的副本(也可能将它们放在您自己的源代码存储库中)。这是我一直喜欢的专业发展方法,谁知道图书馆供应商下周、下个月、明年是否还在维护他的东西?

    【讨论】:

    • 所以这有点依赖提供者的调用,因为他/她更喜欢以“复制/粘贴”方式包含所有依赖项,而我们没有机会仅获取该库的一部分。例如,ChibiOS(微控制器的 RTOS 库)一次包含所有 CMSIS 库,因此我必须包含所有这些库(总共 150MB),即使我只需要 1MB 的代码。在这种情况下准备一个合适的镜像似乎是对库进行相应拆分的方法。
    • @ceremcem:当然这是依赖提供者的调用——如果他们每天为您提供一个新版本,或者一年一次为您提供新版本,那肯定会有所不同。但这也是您认为需要更新到最新版本的频率。仅仅因为您每天都能获得一个新版本,并不一定意味着您需要每年更新一次以上。
    • 再想一想,问题在于我们没有存储我们编译代码所针对的依赖项的确切提交哈希。另一种解决方案可能是在项目中的某个地方(例如./dependencies.txt)在编译时自动记录,声明项目编译到哪个依赖项的哪个提交哈希。该信息可能被用作“安全返回点”,如果项目在未来某个时间拒绝编译,我们可以检查该哈希的依赖项/依赖项。
    • @ceremcem:虽然你没有提到,但我猜你似乎在使用 git?你说的图书馆在哪里?在 Github 上?请澄清。
    • ...如果答案是“是”和“是”,请查看here,Git 子模块可能就是您要找的。​​span>
    【解决方案2】:

    这里是你可以同时吃和吃蛋糕的方法(参见量子物理学):

    1. 使用自己的分布式版本控制系统(git、hg、bazaar 等)在全球位置维护您的依赖项(库)。 (见注 1)
    2. 在项目文件夹中维护一个依赖版本数据库(一个文本文件),并在每次构建时更新它。 (格式:MyLibrary commit-hash-or-version

    Project 将始终使用最新版本的依赖项。如果在某个时候编译失败(例如,当您尝试在 3 年后编译项目时),

    1. 去获取在最后一个成功的构建点使用了哪个版本的依赖项
    2. 在临时位置使用该哈希创建依赖项的签出。
    3. 将临时位置指向构建过程中的依赖路径。

    显然,这种“返回成功点”的过程可以轻松实现自动化。

    注意 1:依赖并不意味着只是源代码,它们可能只是一些二进制格式的工具。在这种情况下,依赖管理器挂钩应使用--version 参数(或适合该工具的参数)调用该工具,获取版本,附加到dependencies.txt 文件。显然,您应该准备好获得该工具的旧版本,以防将来某个时候需要它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-26
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多