如何安装 apt-get 不可用的软件包版本?

如何安装 apt-get 不可用的软件包版本?

我想在 Ubuntu WSL 实例上安装 libuv,并且特别需要版本 1.45.0 或更高版本。

我的理解(来自这篇教程文章)是找出可以安装哪些版本的软件包的命令是apt list | grep

$ apt list | grep libuv

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

libuv1-dev/jammy,now 1.43.0-1 amd64 [installed]
libuv1/jammy,now 1.43.0-1 amd64 [installed,automatic]
libuvc-dev/jammy 0.0.6-1.1 amd64
libuvc-doc/jammy 0.0.6-1.1 all
libuvc0/jammy 0.0.6-1.1 amd64

...这让我认为只有 1.43.0-1 可供安装apt-get,并且它已经安装了。

libuv 的 GitHub 站点表明有更新的版本。

如何在我的 Ubuntu 实例上使用 libuv v1.45.0(或更高版本)apt-get

虽然我的迫切需求是特定于 libuv 的,但我实际上想总体了解 Unix/Linux 生态系统的这个方面:驱动程序/包/等之间的关系是什么。似乎是“已发布”(例如根据其 GitHub 页面)与包管理器“可用”的内容,例如apt-get?如果用户想要一个软件包管理器无法提供的较新版本的软件包,他们应该怎么做?他们应该下载源代码并在本地编译吗?


更新:为什么我需要 1.45.0,即为什么我需要比我的包管理器提供的版本更高级的版本?

我的Linux机器是一个开发环境,我需要在其中编译到主机(即我们可以忽略这个问题的上下文的交叉编译)。我需要编译的应用程序(不是我编写的)依赖于uv_timespec64_t,这显然是在 libuv v1.45.0 per 中引入的这个 git 合并/差异)。

因此,这就是这个问题的前提:我需要编译(到主机)一个应用程序,该应用程序依赖于比我的 Linux 发行版的包管理器提供的更新版本的 libuv 中的功能。


更新:这个问题有一个相关的后续问题:为什么不同的 Linux 发行版有不同的包格式(和包管理器)?

答案1

树干和树木

在 @TechLoom 回答您有关 的问题的同时libuv,请允许我回答您有关 Linux 生态系统的问题。让我们从这张图的时间线

在新的浏览器选项卡中打开它,请注意有 5 个主要主干:

  1. 斯莱克软件
  2. 德班
  3. Red Hat 走向了企业化,免费版本被称为 Fedora
  4. 以诺(Enoch)的寿命很短,后来成为了 Gentoo

每个分支以及所有子分支主要由正在使用的包管理系统定义。

  • 基本 Slackware 使用 zip/unzip/tar。包解压并手动编译
  • Debian(Ubuntu 是其子品牌)使用 APT(高级打包工具,如果我没记错的话)
  • Red Hat/Fedora 使用 RPM - RPM 包管理器
  • Enoch 和它的孩子们使用脚本从头开始编译所有内容。想象一下 Slackware,但自动化且可配置
  • Arch 是一个混合体,多年来一直表现良好。用户可以拥有一个完全二进制打包的系统,即像Debian那样打包,或者像Enoch那样完全编译的系统,或者两者的混合。

现在,至于生态系统如何连接。每个包管理器都配置为仅连接到其指定的包树(也称为存储库)。基于 Debian 的系统连接到基于 APT 的树,您可以在其中下载和安装.deb文件。这些包管理器中的每一个都允许用户安装自定义树。基于 Ubuntu 的系统将其称为 PPA,即个人软件包档案。

发布周期

每个发行版,无论包管理器如何,都有一个发布周期。发布周期可以被认为是“锁定的存储库”或使用树的类比:“不再生长的健康树”。存储库仅包含属于该特定版本的包。一般来说,该版本安装的软件包永远不会更改,并且仅在极少数情况下更新,即发布关键错误修复时(这就是您在该版本中找不到 libuv-1.45 的原因jammy),但如果您查看manticnoble,则下一个未来版本的几个代号,您可以看到包裹被撞了(看版本更新以下)。浏览器和邮件客户端等软件通常会发布到contrib(贡献的)存储库,这不会干扰main存储库。在 Debian 的术语中,我相信他们称之为贡献存储库universe,这非常合适(阳光下的每一个用户软件都可以放在那里)。每个添加的包都会根据存储库中的库和工具进行编译main、打包并上传到universe存储库。这模仿了用户或公司添加的软件的“锁定存储库”概念。

就 Ubuntu 而言,发布周期通常每年发生两次(一次在四月,一次在十月,除非有次要版本更新[第三个版本号])。您可以通过查看Ubuntu 发行版列表。可接受的做法是仅使用您的版本中可用的软件包,直到维护者更新该软件包。

请注意,某些发行版使用滚动发布模型,特别是那些基于源代码的发行版。我可以在源编译的 Gentoo 盒子上发出更新命令,重建软件包,一小时后执行相同的更新,并可能再次更新相同的软件包。

即使是我们的朋友,或者敌人(取决于您的喜好),微软也采用了从 Windows 10 开始的发布模型。当前版本的 Windows 11 版本为 23H2,即 2023 年下半年。Windows 10 的第一个主要版本是记得是 1903 年,指的是 2019 年 3 月。虽然 Microsoft 的“树”并未公开发布,但它用于将基于错误修复和用户请求的更新集成到未来版本的 Windows 中。

为什么版本锁定很重要

要理解为什么锁定概念如此重要,想象一下您拥有一辆宝马汽车。宝马大部分都是手工制造和手工调整的。假设我们决定将 2025 年车型中的功能 X 添加到我们 2023 年购买的车型中,而无需先与 BMW 沟通。

  • 我们从网络购买启用功能 X 所需的部件
  • 我们将该部件安装在仪表板中并连接到电气系统,并意识到功能 X 的部件需要特殊的连接器。
  • 我们尝试在没有连接器的情况下连接功能 X 的部件,最终损坏了我们的 6 位数汽车
  • 我们联系了宝马,并告诉他们我尝试连接功能 X,但造成的损害比升级更大。宝马向我们发送了一个连接器,并告诉我们让授权机械师将所有东西组装在一起

我加粗了最后一颗子弹,将所有这些联系在一起。在上面的“升级”中,宝马是“锁定存储库”的维护者。宝马拥有或可以在询问时获得其大多数汽车的所有零件。特殊连接器不存在于树之外。同样,如果软件存在于存储库中,您只能向您的 Ubuntu 版本(也就是本故事中的汽车)添加软件或升级。混合不同版本的存储库会导致完全损坏。如果在之前的版本中需要添加或升级Feature X,则该软件向后移植,并将 get 添加到该特定版本的main存储库(机械师),并且该版本继续按预期运行(汽车已修复)。

版本更新

版本升级(即从 1.43 到 1.45)通常按如下方式完成:

  1. 维护者注意到新版本,或者用户向维护者提交版本更新请求
  2. 请求的版本将发送到测试版本以测试稳定性。在 Ubuntu 中,这称为未来版本
  3. 该软件包经过测试,并在未来版本成为当前版本时被撤销或批准并发布

LTS 版本

对于需要稳定性的用户,某些发行版使用长期服务版本的概念。这些通常是具有关键任务应用程序(例如 Web 服务器、防火墙或域控制器)的区域的首选。

答案2

您可以从 github 页面下载源代码。

https://github.com/libuv/libuv/releases

然后只需提取源文件并编译程序,然后安装即可。所有步骤都在 github 页面上。

https://github.com/libuv/libuv#build-instructions

$ sh autogen.sh
$ ./configure
$ make
$ make check
$ make install

另一种选择是查看是否有人拥有该项目的存储库。然后你可以使用“add-apt-repository”,然后像你想要的那样使用 apt 。

相关内容