@robsean
https://linux.cn/article-14760-1.html
This commit is contained in:
Xingyu Wang 2022-06-26 14:56:36 +08:00
parent cdb1318a98
commit 74105d12d8

View File

@ -3,20 +3,22 @@
[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" [#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/"
[#]: collector: "lkxed" [#]: collector: "lkxed"
[#]: translator: "robsean" [#]: translator: "robsean"
[#]: reviewer: " " [#]: reviewer: "wxy"
[#]: publisher: " " [#]: publisher: "wxy"
[#]: url: " " [#]: url: "https://linux.cn/article-14760-1.html"
在 Ubuntu 中使用 apt 命令来安装具体指定的软件包版本 如何在 Ubuntu 中安装具体指定的软件包版本
====== ======
在 Ubuntu 中想安装一个软件包的一个具体指定的软件包版本?你可以通过下面的方式来轻松地完成: ![](https://img.linux.net.cn/data/attachment/album/202206/26/145335zcrpducpup4p2ugy.jpg)
在 Ubuntu 中想安装一个软件包的一个特别指定的版本?你可以通过下面的方式来轻松地完成:
``` ```
sudo apt install package_name=package_version sudo apt install package_name=package_version
``` ```
你如何知道某个软件包有哪些可用的版本?使用这个命令: 你如何知道某个软件包有哪些可用的版本?可以使用这个命令:
``` ```
apt list --all-versions package_name apt list --all-versions package_name
@ -28,23 +30,23 @@ apt list --all-versions package_name
听起来像一个简单的任务,对吧?但是事情并非看起来那么简单。这里有一些不确定是否会出现,但是可能会涉及的东西。 听起来像一个简单的任务,对吧?但是事情并非看起来那么简单。这里有一些不确定是否会出现,但是可能会涉及的东西。
这篇教程将涵盖使用 apt 或 apt-get 命令来安装一个具体指定的程序的版本的所有的重要的方面。 这篇教程将涵盖使用 `apt``apt-get` 命令来安装一个具体指定的程序的版本的所有的重要的方面。
### 关于安装一个具体指定版本的程序而所需要知道的事 ### 安装一个具体指定版本的程序需要知道的事
在基于 Ubuntu 和 Debian 发行版中,你需要知道一些关于 APT 和 存储库 是如何工作的知识 在基于 Ubuntu 和 Debian 发行版中,你需要知道一些关于 APT 和存储库是如何工作的知识
#### 同一个软件包源没有较旧的版本 #### 同一个软件包源没有较旧的版本
Ubuntu 在其存储库中不保留较旧版本的软件包。在特殊的情况下,你可以暂时性地看到多个版本。例如,你运行 apt 更新 (但不升级),那么会用一个可用的新的版本。在 apt 缓存中,你可以看到同一个软件包的两个版本。但是,一旦软件包被升级到了新的版本,较旧版本的软件包将从 **apt 缓存** 和 存储库 中移除。 Ubuntu 在其存储库中不保留较旧版本的软件包。在特殊的情况下,你可以暂时性地看到多个版本。例如,你运行 APT 更新(但不升级)时,可能会有一个可用的新版本。在 APT 缓存中,你可以看到同一个软件包的两个版本。但是,一旦软件包被升级到了新的版本,较旧版本的软件包将从 **APT 缓存** 和存储库中移除。
#### 使用多个软件包源来使用不同的版本 #### 使用多个软件包源来使用不同的版本
为获取同一个的软件包的多个版本,你将必需条件多个软件包源。例如VLC 是版本 3.x 系列。添加 [VLC 每日构建 PPA][2] 将会提供 (不稳定是) 版本 4.x 系列。 为获取同一个的软件包的多个版本,你必须得添加多个软件包源。例如VLC 是版本 3.x 系列。添加 [VLC 每日构建 PPA][2] 将会提供(不稳定的)版本 4.x 系列。
同样,**你可以下载不同版本的 DEB 文件,并安装它**。 同样,**你可以下载不同版本的 DEB 文件,并安装它**。
#### 较高版本编号的版本通常获取优先权 #### 较高版本编号的版本通常优先权
如果你有来自多个软件包源的相同名称的软件默认情况下Ubuntu 将安装可用的最高版本编号的版本。 如果你有来自多个软件包源的相同名称的软件默认情况下Ubuntu 将安装可用的最高版本编号的版本。
@ -52,11 +54,11 @@ Ubuntu 在其存储库中不保留较旧版本的软件包。在特殊的情况
#### 较旧版本将升级到可用的较新版本 #### 较旧版本将升级到可用的较新版本
这是另外一个可能存在的问题。即使你安装较旧版本的软件包,它也会升级到较新的版本 (如果存在可用的较新的版本)。你必须 [监禁软件包来防止其升级][3] 。 这是另外一个可能存在的问题。即使你安装较旧版本的软件包,它也会升级到较新的版本(如果存在可用的较新版本)。你必须 [保留该软件包来防止其升级][3] 。
#### 依赖关系也需要安装 #### 依赖关系也需要安装
如果软件包有依赖关系,你也需要安装必要的依赖关系软件包版本 如果软件包有依赖关系,你也需要安装必要的依赖关系软件包。
现在,你已经知道一些可能存在的问题,让我们看看如何解决它们。 现在,你已经知道一些可能存在的问题,让我们看看如何解决它们。
@ -69,20 +71,20 @@ Ubuntu 在其存储库中不保留较旧版本的软件包。在特殊的情况
![install specific versions apt ubuntu][4] ![install specific versions apt ubuntu][4]
``` ```
[email protected]:~$ apt list -a vlc ~$ apt list -a vlc
Listing... Done Listing... Done
vlc/jammy 4.0.0~rc1~~git20220516+r92284+296~ubuntu22.04.1 amd64 vlc/jammy 4.0.0~rc1~~git20220516+r92284+296~ubuntu22.04.1 amd64
vlc/jammy 3.0.16-1build7 amd64 vlc/jammy 3.0.16-1build7 amd64
vlc/jammy 3.0.16-1build7 i386 vlc/jammy 3.0.16-1build7 i386
``` ```
因为较高版本编号版本获取优先权,使用 apt install vlc 命令将会导致安装 VLC 的 4.0 版本。但是,因为这篇教程的缘由,我想安装较旧的版本 3.0.16 。 因为较高版本编号版本有优先权,使用 `apt install vlc` 命令将会导致安装 VLC 的 4.0 版本。但是,因为这篇教程的缘由,我想安装较旧的版本 3.0.16 。
``` ```
sudo apt install vlc=3.0.16-1build7 sudo apt install vlc=3.0.16-1build7
``` ```
但是,这里会有这样的事。vlc 软件包有一些依赖关系,并且这些依赖关系也需要具体指定的版本。因此,在 Ubuntu 为其尝试安装最新的版本时,你将会遇到经典的 [<ruby>你已持有残缺软件包<rt>you have held broken packages</rt></ruby>][5] 错误。 但是,这里会有这样的事。VLC 软件包有一些依赖关系,并且这些依赖关系也需要具体指定的版本。因此,在 Ubuntu 为其尝试安装最新的版本时,你将会遇到经典的 <ruby>[你已保留残缺软件包][5]<rt>you have held broken packages</rt></ruby> 错误。
![problem installing specific version apt ubuntu][6] ![problem installing specific version apt ubuntu][6]
@ -103,13 +105,13 @@ sudo apt install vlc=3.0.16-1build7 \
vlc-plugin-visualization=3.0.16-1build7 vlc-plugin-visualization=3.0.16-1build7
``` ```
以免你瞎琢磨,每行结尾处的 \ 只是用来将多行命令来写入同一个命令的一种方式。 说明一下,每行结尾处的 `\` 只是用来将多行命令来写入同一个命令的一种方式。
**它有作用吗?在很多情况下,它是有作用的。** 但是,我选择了一个复杂的 VLC 示例,它有很多依赖关系。甚至这些所涉及的依赖关系也依赖于其它的软件包。所以,它就变得令人难以处理。 **它有作用吗?在很多情况下,它是有作用的。** 但是,我选择了一个复杂的 VLC 示例,它有很多依赖关系。甚至这些所涉及的依赖关系也依赖于其它的软件包。所以,它就变得令人难以处理。
一种可选的方法是在安装时指定软件包源。 一种替代的方法是在安装时指定软件包源。
#### 可选,指定存储库软件包源 #### 替代方式,指定存储库
你已经添加多个软件包源,因此,你应该对这些软件包的来源有一些了解。 你已经添加多个软件包源,因此,你应该对这些软件包的来源有一些了解。
@ -119,7 +121,7 @@ sudo apt install vlc=3.0.16-1build7 \
apt-cache policy | less apt-cache policy | less
``` ```
聚焦于存储库名称后面的行: 注意存储库名称后面的行:
``` ```
500 http://security.ubuntu.com/ubuntu jammy-security/multiverse i386 Packages 500 http://security.ubuntu.com/ubuntu jammy-security/multiverse i386 Packages
@ -127,9 +129,9 @@ apt-cache policy | less
origin security.ubuntu.com origin security.ubuntu.com
``` ```
你可以具体指定 o、l、a 等参数。 你可以具体指定 `o``l``a` 等参数。
在我原来的示例中,我想安装来自 Ubuntu 存储库的 VLC (获取版本 3.16) ,而不是安装来 PPA 的版本 (它将向我提供版本 4) 在我原来的示例中,我想安装来自 Ubuntu 存储库的 VLC(获取版本 3.16),而不是安装来 PPA 的版本(它将向我提供版本 4
因此,下面的命令将安装 VLC 版本 3.16 及其所有的依赖关系: 因此,下面的命令将安装 VLC 版本 3.16 及其所有的依赖关系:
@ -143,9 +145,9 @@ sudo apt install -t "o=ubuntu" vlc
**还能做什么?** **还能做什么?**
为安装较旧的软件包版本,从你的系统中移除较新版本的软件包源 (如果可能的话)。它将有助于逃脱这些依赖关系的地狱。 为安装较旧的软件包版本,从你的系统中移除较新版本的软件包源(如果可能的话)。它将有助于逃脱这些依赖关系地狱。
如果不能这么做,检查你是否可以从其它一些打包软件包的格式来获取,像 Snap、Flatpak、AppImage 等等。事实上Snap 和 Flatpak 也允许你从可用的版本中选择和安装。因为这些应用程序是沙盒模式的,所以它很容易管理不同版本的依赖关系。 如果不能这么做,检查你是否可以从其它一些软件包的打包格式来获取,像 Snap、Flatpak、AppImage 等等。事实上Snap 和 Flatpak 也允许你从可用的版本中选择和安装。因为这些应用程序是沙盒模式的,所以它很容易管理不同版本的依赖关系。
#### 保留软件包,防止升级 #### 保留软件包,防止升级
@ -155,17 +157,17 @@ sudo apt install -t "o=ubuntu" vlc
sudo apt-mark hold package_name sudo apt-mark hold package_name
``` ```
你可以除保留软件包,以便它能稍后升级: 你可以除保留软件包,以便它能稍后升级:
``` ```
sudo apt-mark unhold package_name sudo apt-mark unhold package_name
``` ```
注意,软件包的依赖关系不会自动地保持。它们需要单独地提及 注意,软件包的依赖关系不会自动地保留。它们需要单独地指明
### 结论 ### 结论
如你所见,这里有一条安装选定软件包版本的条文。只要软件包有依赖关系,那么事情就会变得复杂。接下来,你将进入依赖关系的地狱。 如你所见,安装选定软件包版本有一定之规。只有当软件包有依赖关系时,那么事情就会变得复杂,然后,你就会进入依赖关系地狱。
我希望你在这篇教程中学到一些新的东西。如果你有问题或建议来改善它,请在评论区告诉我。 我希望你在这篇教程中学到一些新的东西。如果你有问题或建议来改善它,请在评论区告诉我。
@ -176,7 +178,7 @@ via: https://itsfoss.com/apt-install-specific-version-2/
作者:[Abhishek Prakash][a] 作者:[Abhishek Prakash][a]
选题:[lkxed][b] 选题:[lkxed][b]
译者:[robsean](https://github.com/robsean) 译者:[robsean](https://github.com/robsean)
校对:[校对者ID](https://github.com/校对者ID) 校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出