标签 软件包 下的文章

如果在 Arch Linux 中安装软件包时遇到 “target not found” 错误,你可以采取以下措施。

有一天,我尝试在 Arch Linux 上安装 Hyprland。当我使用 Pacman 命令安装 它时,它抛出 “target not found”(目标未发现)错误。

$ sudo pacman -S hyprland
[sudo] password for abhishek:
error: target not found: hyprland

这是一个意外,因为我知道 Hyprland 是可用的。

我的修复方法是更新系统,在大多数情况下,它可以解决此问题。

sudo pacman -Syu

这里,本地包数据库不同步。我需要更新缓存。这里还建议更新系统。

在大多数情况下,这就是修复此错误的方法。但是,你看到此错误的原因可能还有其他一些。让我在这里详细讨论它们。

修复:更新系统

Arch Linux 是一个 滚动发布发行版,并且它提供的更新非常频繁。如果你不每隔几天更新一次系统,你的本地包数据库将与远程镜像不同步,并且你将在安装软件包时遇到问题。

本地包数据库仅保留包的元数据,例如版本号、用于获取包的仓库 URL 等。

当你搜索软件包时,pacman 会提供搜索结果,表明该软件包可用。但是,该包在你的本地数据库中具有较旧的版本号。当 pacman 在远程仓库中搜索包(以获取实际的包)时,它不再找到旧版本的 URL。

这就是导致 “target not found” 错误的原因。

修复方法是更新本地数据库。这可以与 pacman -Sy 一起使用,但是,建议 更新整个 Arch Linux 系统 以避免依赖冲突等。

sudo pacman -Syu
? 如果你已有几周没有更新系统,请做好更新超过 1 GB 的准备。这可能需要一些时间,具体取决于你的互联网速度和你使用的镜像。

就我而言,Arch 安装在我的辅助系统上。由于我一周左右无法使用它,该系统已经过时了。更新后,我就可以安装 Hyprland

? 如果这不起作用,请通过添加额外的 y 强制刷新所有包数据库: sudo pacman -Syyu

修复 “target not found” 错误的其他建议

如果上述方法没有为你解决此错误,这里有一些修复此错误的提示。

仔细检查包名称

我亲爱的 Watson,这可能看起来很简单,但人们通常只是错误地输入了包名称。

Linux 区分大小写,包通常以小写命名。因此,如果你要使用一个名为 Flameshot 的流行工具,那么它的包名称很可能是 flameshot。

此外,某些软件的拼写与常见软件的拼写不同。例如,它是 hyprland,这使我错误地输入了 hyperland(使用通常的 “hyper” 拼写)。

在极少数情况下,可能会混淆是 lI 或者 1

基本上,确保你输入的包名称是正确的。

查看该软件包在仓库中是否可用

Arch Linux 的仓库中有大量软件包。但这并不意味着它拥有所有可能的 Linux 软件包。

访问 Arch Linux 官方软件包网站:

Arch Linux 软件包搜索

在这里输入包名,查看该包是否可用。如果是,它是哪个仓库以及它在哪个设备上可用。

x86_64 适用于英特尔架构,任何包含 ARM 架构的均适用于 树莓派类设备

? 如果在某些仓库中找到该软件包,但 pacman 即使在更新的系统上也找不到它,请检查 pacman.conf 文件并查看是否启用了所述仓库。

确保它不是 AUR 包

Arch 用户仓库(AUR) 是提供更新包的附加社区支持平台。

现在,有多种使用 AUR 包的方法,但 pacman 不是其中之一。

检查你尝试安装的软件包是否是 AUR 软件包。首先检查官方 Arch 仓库,如上所述。如果不存在,请检查 AUR 页面。

如果它是 AUR 包,则必须 使用 yay 或一些 其他 AUR 帮助程序。你不能使用 pacman 安装 AUR 软件包。

你能解决这个问题吗?

在大多数情况下,更新系统可以解决此问题。在极少数情况下,可能还有其他原因,我已经提到了一些建议。

现在轮到你了。如果你能够解决此问题,请在评论区告诉我。

(题图:MJ/b71c9760-4cb1-41de-a336-3e38026bcfeb)


via: https://itsfoss.com/target-not-found-arch-linux/

作者:Abhishek Prakash 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

你大概知道怎么在 Ubuntu 中使用 apt 命令安装软件包。那些软件包都是来自 Ubuntu 的官方存储库。

那第三方或者外部存储库呢?不,我这里并不是要讲 PPA。

早晚你会碰到那种至少四行的安装说明:你需要安装名为 apt-transport-https 的包、操作一下 GPG 和 源列表 source list 之后,你才能正常安装软件包。

没有什么印象的话,那我分享一个 在 Ubuntu 上安装最新版本的 Yarn 的例子:

sudo apt install apt-transport-https curl
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
sudo sh -c 'echo "deb https://dl.yarnpkg.com/debian/ stable main" >> /etc/apt/sources.list.d/yarn.list'
sudo apt update && sudo apt install yarn

当你需要直接从开发者那里安装编程工具的时候,大概率会碰到这种安装方式。

许多人只是按照说明进行操作,并不会去思考其中的原理。这也没什么不对,但了解该过程实际上可以提升你在这方面的知识,而且有助于之后排除故障。

我来解释一下这些代码背后的逻辑。

理解从外部存储库安装的过程

在你继续往下阅读之前,我强烈建议你先看看下面这两篇文章,方便理解后续的概念:

为了让你有点印象,这里有一张软件包存储库和 Linux 中的包管理器 的图片。

Illustration of repository and package manager

整件事情其实就是在系统中添加一个新的外部存储库。这样,你就可以从这个新存储库下载并安装可用的软件包。如果这个存储库提供了包版本的更新,你可以在更新系统的同时更新这些软件包(apt update && apt upgrade)。

那么,这是什么工作原理呢?让我们一条一条地过一遍。

第 1 部分:为 apt 获取 HTTPS 支持

第一行是这样的:

sudo apt install apt-transport-https curl

curl 是一个 Linux 终端下载文件的工具。这里主要的部分是安装 apt-transport-https,但事实上已经不需要了。

明白了吗?这个 apt-transport-https 包让你的系统通过 HTTPS 协议安全访问存储库。按照设计,Ubuntu 的存储库使用 http 而不是 https 协议。

看看下面的截图。 https 这张图是我已经添加到系统中的外部存储库。Ubuntu 的存储库和 PPA 使用 http 协议。

在旧版本的 apt 包管理器中,不支持 https 协议。apt-transport-https 包为 apt 添加了 https 支持。要新增一个使用 https 的存储库,首先就得先安装此包。

我之前不是说不需要安装这个包了吗?是的,因为较新版本的 apt(高于 1.5)已经支持 https,所以你不需要再安装 apt-transport-https

但是你依然看到我在说明中提到了这个包。这更多是出于遗留原因,而且可能还有很旧的发行版在使用旧版本的 apt 包。

现在,你可能想知道既然 https 是安全协议,那为什么 Ubuntu 的存储库还要使用 http 而不是 https。这难道没有安全风险吗?接着往下看你就知道答案了。

第 2 部分:添加远程存储库的 GPG 密钥

Linux 存储库内置了基于 GPG 密钥的安全机制。每个存储库都将其 GPG 公钥添加到你的系统信任密钥中。来自存储库的包由这个 GPG 密钥“ 签名 signed ”,并且通过这份存储的公钥,系统能够验证软件包正是来自这个存储库。

如果 密钥之间不匹配,你的系统会发出提醒,而不会继续从该存储库安装或者更新软件包。

到目前为止,一切都很顺利。下一步是将外部存储库的 GPG 公钥添加到你的 Linux 系统,以便它能接收来自该存储库的软件包。

curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -

在上面的命令中,你使用 curl 从指定的 URL 下载 GPG 密钥。选项 -sS 能够让你不看多余的输出(静默模式),但会显示错误(如果有的话)。最后一个 - 告诉 apt-key 使用 标准输入 stdin 而不是文件(在本例中是 curl 命令的输出)。

apt-key add 命令已经将下载的密钥添加到系统中。

你可以通过 apt-key list 命令查看系统中各种存储库添加的 GPG 密钥。

List GPG keys

这是将 GPG 密钥添加到系统的一种方法。你会看到一些其它的命令,看起来略有不同,但效果一样,都是将存储库的公钥添加到你的系统里面。

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9

你会注意到 apt-key 已被弃用的警告。在 Ubuntu 22.04 之前,你还可以使用 apt-key 命令,但它最终会被删除。现在不需要杞人忧天。

第 3 部分:将外部存储库添加到源列表

下个命令是在系统的源列表中添加一个新条目。这样,你的系统就会知道它得检查该存储库中的包和更新。

sudo sh -c 'echo "deb https://dl.yarnpkg.com/debian/ stable main" >> /etc/apt/sources.list.d/yarn.list'

有一个文件 /etc/apt/sources.list 包含 Ubuntu 存储库的详细信息。最好不要随便动这个文件。所有新增的存储库都应放在 /etc/apt/sources.list.d 目录中相应的文件里(约定以 .list 结尾)。

External repository should have their own sources list file in the /etc/apt/sources.list.d directory

这使得包管理变得更容易。如果你要从系统中删除一个存储库,只需删除相应的源文件即可。无需修改主 sources.list 文件。

让我们再仔细地看一下这行命令。

sudo sh -c 'echo "deb https://dl.yarnpkg.com/debian/ stable main" >> /etc/apt/sources.list.d/yarn.list'

使用 sh 可以在一个新的 shell 进程中运行命令,而不是 子 shel​​l-c 选项告诉 sh 命令从参数而不是标准输入读取命令。然后它运行 echo 命令,也就是把 deb https://dl.yarnpkg.com/debian/ stable main 这一行添加到 /etc/apt/sources.list.d/yarn.list 文件(会创建该文件)。

现在,你可以通过各种方法在指定目录中创建 .list 文件并在其中添加包含存储库详细信息的数据行。你也可以像这样使用:

echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list

明白了吧?

第 4 部分:从新添加的存储库安装应用程序

到目前为止,你已经将存储库的 GPG 密钥和存储库的 URL 添加到系统中。

但是系统仍然不晓得这个新存储库中有哪些可用的包。这就是为什么你需要先使用下面这个命令更新包元数据的本地缓存:

sudo apt update

这时你的系统就已经知道新增存储库中可用软件包的信息,现在可以试试安装软件包:

sudo apt install yarn

为了节省时间,你可以在 同一行挨着运行这两个命令e。

sudo apt update && sudo apt install yarn

&& 可以确保第二个命令只会在前一个命令没有任何报错的前提下运行。

整个流程就是这样。

有没有豁然开朗呢,还是一脸懵逼?

我已经解释了在 Ubuntu 中使用外部存储库背后的逻辑。希望你现在能更好地理解它,当然可能还有很多细节会让你困惑。

如果你还不清楚或者还有其他问题,可以联系我。如果你发现了技术上的纰漏,记得在评论区告诉我。


via: https://itsfoss.com/adding-external-repositories-ubuntu/

作者:Abhishek Prakash 选题:lujun9972 译者:nophDog 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

更新 Linux 系统并没有那么复杂,不是吗?毕竟,要更新 Ubuntu 之类的发行版,你只需要使用 apt updateapt upgrade 就行。

如果所有的包都是通过一个包管理器安装的,就会是这样。

但现在情况不再如此。你有经典的 apt/dnf/pacman,还有 Snap、Flatpak、Appimages。不止于此,你还可以使用 PIP(用于 Python)和 Cargo(用于 Rust)安装应用。

使用 Node? NPM 包需要单独更新。Oh My Zsh?需要单独更新。Vim 中的插件、Atom 等也可能不被 apt/dnf/pacman 覆盖。

你现在看到问题了吗?这就是名为 Topgrade 的新工具旨在解决的问题。

Topgrade:处理各种更新的单一程序

Topgrade 是一个 CLI 程序,它会检测你使用的工具,然后运行适当的命令来更新它们。

Topgrade disable system

除了通常的 Linux 包管理器,它还可以检测和更新 Brew、Cargo、PIP、Pihole、Vim 和 Emacs 插件、R 软件包等。你可以在 维基页面 上查看支持的包列表。

Topgrade 的主要特点:
  • 能够更新来自不同的包管理器的软件包,包括固件
  • 你可以如何控制更新包。
  • 高度可定制。
  • 甚至能够在更新包之前进行概览。

所以不要浪费任何时间,让我们跳到安装。

使用 Cargo 在 Linux 中安装 Topgrade

安装过程非常简单,因为我将使用 Cargo 包管理器。

我们已经有了 详细指南,其中包含设置 Cargo 包管理器的多种方法。所以我将在我的示例中使用 Ubuntu 来快速完成。

因此,让我们以最少方式安装依赖项以及 Cargo:

sudo apt install cargo libssl-dev pkg-config

安装 Cargo 后,使用给定的命令安装 Topgrade:

cargo install topgrade

它会抛出一个警告:

cargo error

你只需添加 cargo 路径即可运行二进制文件。这可以通过给定的命令来完成,你需要使用你的用户名替换 sagar

echo 'export PATH=$PATH:/home/sagar/.cargo/bin' >> /home/sagar/.bashrc

现在,重启系统,Topgrade 就可以使用了。但是等等,我们需要安装另一个包来更新 Cargo 以获取最新的包。

cargo install cargo-update

这样我们完成了安装。

使用 Topgrade

使用 Topgrade 非常简单。使用一个命令,就是这样:

topgrade

但这不会给你除了系统包之外的任何控制,但正如我所提到的,你可以将不想更新的仓库列入黑名单。

从 Topgrade 中排除包管理器和仓库

假设我想排除 Snap 和从默认包管理器下载的包,所以我的命令是:

topgrade --disable snap system

Topgrade disable snap system

要进行永久更改,你必须在其配置文件中进行一些更改,这些更改可以通过给定的命令访问:

topgrade --edit-config

对于此示例,我排除了 Snap 和默认系统仓库:

configuring Topgrade

试运行 Topgrade

评估将要更新的过时软件包总是一个好主意,我从 Topgrade 的整个目录中找到了这个最有用的选项。

你只需使用带有 -n 选项的 topgrade 命令,它就会生成过期软件包的摘要。

topgrade -n

summery of Topgrade

检查需要更新的软件包的一种简洁方法。

总结

在使用 Topgrade 几周后,它成为了我的 Linux 武器库中不可或缺的一部分。 像大多数其他 Linux 用户一样,我只是通过我的默认包管理器更新包。 Python 和 Rust 包被完全忽略了。 感谢 Topgrade,我的系统现在完全更新了。

我知道这不是每个人都想使用的工具。那你呢?愿意试一试吗?


via: https://itsfoss.com/topgrade/

作者:Sagar Sharma 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在这篇文章中,我将向你展示各种 Flatpak 命令,使你成为 Flatpak 的专业用户。

Flatpak 沙盒技术是 Linux 应用分发的未来。如今,几乎所有重要的发行版都预装了 Flatpak,因为采用它很容易,维护它也更直接。

如果你每天都使用 Flatpak,你可能知道这些命令。但如果你还在考虑把每一个应用程序都转到 Flatpak,那么你应该通过这个命令列表来了解如何轻松管理 Flatpak 应用程序。

因此,为了帮助你做到这一点,我列出了一些易于使用的 Flatpak 命令供你参考,这些命令是从文档中的大量命令集中筛选出来的。

Flatpak 命令参考

首先,我们来谈谈一些基本的命令。

1、安装 Flatpak

自从上次我检查过后,如今所有重要的发行版都预装了 Flatpak。因此,你可能不需要安装它。

然而,安装 Flatpak 就像在这两个主要发行版中运行以下命令一样简单:

sudo apt install flatpak // 用于 Ubuntu 和相关发行版
sudo dnf install flatpak // 适用于 Fedora 和基于 RPM 的发行版

如果你正在运行其他发行版,你可以查看我们关于 Flatpak 安装的 详细指南

2、设置 Flatpak 远程仓库

接下来,你需要在安装后设置与 远程仓库 remote 的连接。远程仓库就像是一个存储库(参考 PPA),用来分发 Flatpak 应用程序。

主要的仓库是 Flathub,你可以用下面的命令来设置它。这个命令对所有发行版都是一样的。完成后,重新启动你的系统,你就可以安装 Flatpak 应用程序了。

flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

提示:如果你有别的远程仓库,你可以使用相同的命令来添加该仓库。在一个系统中设置多个远程仓库是正常的。

提示:另外,你可以指定 --user--system 开关来安装特定于你的用户 ID 或整个系统的 Flatpak 远程仓库。

flatpak remote-add --if-not-exists --user https://flathub.org/repo/flathub.flatpakrepo
flatpak remote-add --if-not-exists --system https://flathub.org/repo/flathub.flatpakrepo

3、从 Flathub 安装 Flatpak 应用程序

Linux 中大多数重要的基于 GUI 的软件商店都默认允许安装 Flatpak 应用程序。例如,如果你正在使用“ 软件 Software ”(适用于 Ubuntu 或 Fedora GNOME 版),你可以找到应用程序并点击安装按钮进行安装。

或者,在 KDE Plasma 的 “ 发现 Discover ” 中:

KDE “发现”可以从 Flathub 拉取 Flatpak 应用程序

但是,最简单的方法是复制 Flathub 商店 中的安装命令(可在每个应用程序信息页面的底部找到)并将其粘贴到终端。这是安装 Flatpak 应用程序的最快方法。

flatpak install org.kde.kdenlive

4、运行一个应用程序

有两种方法来运行你安装的 Flatpak 应用程序。你可以在图形化桌面环境的应用程序菜单中找到它。或者,你可以使用简单的运行(run)参数来启动。

你可以从 Flathub 应用程序页面找到运行命令。

flatpak run org.kde.kdenlive

现在,你已经学会了如何设置、安装和运行 Flatpak 应用程序。现在是时候深入了解一下了。

5、找出已安装的 Flatpak 应用程序列表

经过几年,你可能已经安装和删除了许多 Flatpak 应用程序。但是,你怎么找出安装了多少 Flatpak 应用程序?或者你可能想知道系统所安装的 Flatpak 应用是什么。

这里有一些 Flatpak 命令(通过终端运行),可以在这方面帮助你。

一个简单的 flatpak 命令可以列出所有安装的应用程序。这包括系统应用和你的应用:

flatpak list

只显示你的应用程序:

flatpak --user list

更详细一点,你可以在上述两个命令中使用额外的列(如名称、大小等)进行过滤:

flatpak --columns=app,name,size,installation list
flatpak --columns=name,size --user list

flatpak 带有额外列的列出命令

6、找出已安装应用程序的更多信息

现在,你已经通过上述 Flatpak 命令安装了一个应用程序。但是,如果你想知道架构、版本、分支、许可证和其他信息,该怎么办呢?你可以使用 info 参数来实现。这个命令需要 Flatpak 的 “应用 ID”,你可以通过上面的 flatpak list 命令得到它。

例如:

flatpak info org.kde.kdenlive

flatpak info 命令

7、找出 flatpak 命令在你系统中的全部历史记录

flatpak 命令中的 histroy 开关会列出在你的系统中发生的活动,包括安装、更新、卸载和日期时间戳。如果你想调查一些事情,这非常有用。

flatpak history

8、更新 Flatpak 应用程序

flatpak 命令中的 update 参数可以更新所有的应用程序和运行时。当你运行这个命令时,它会显示可用的更新,并要求你确认是否继续。

flatpak update

如果你想更新一个特定的应用程序而不是整个系统,请使用 --app--runtime 开关,分别用于应用程序和运行时。

例如,如果我想在我的系统中只更新 kdenlive,我将运行以下命令:

flatpak update --app org.kde.kdenlive

提示update 参数通常会更新到任何程序的分支顶端。然而,使用 update 参数中的 --commit 开关,你可以更新到 Flatpak 中的某个特定分支(升级或降级)。例如:

flatpak update --app org.kde.kdenlive --commit 37103f4ee56361a73d20cf6957d88f3cab802909a5966c27a6e81d69795a15

如果你想使用同一个应用程序的多个版本,这个 --commit 开关是非常有用的。

flatpak 带有提交开关的更新命令示例

9、管理 Flatpak 应用程序的权限

不同的应用程序需要不同的权限,如摄像头、麦克风、屏幕等等。通过命令来管理这些单独的权限有点让人不知所措。因此,管理 Flatpak 权限的最好方法是使用另一个叫做 Flatseal 的 Flatpak 应用程序。它为你提供了一个漂亮的 GUI,有切换按钮来启用/禁用/审查已安装的 Flatpak 应用程序的权限。

你可以在 这里 阅读 Flatseal 的更多信息。

10、卸载 Flatpak 应用程序的命令

卸载 Flatpak 应用程序有不同的使用情况。所以,这里是快速指南。

要卸载单个应用程序,使用 uninstall 参数和应用程序 ID。例如:

flatpak uninstall org.kde.kdenlive

要卸载所有应用程序,使用 —all 开关:

flatpak uninstall --all

要卸载未使用的应用程序,请使用以下方法:

flatpak uninstall --unused

11、删除并去除 Flatpak 应用程序的所有痕迹

使用以下命令时要特别小心,因为它将删除一切。

即使你卸载了 Flatpak 应用程序,一些应用程序的数据仍然保留在你的系统中,除非你在运行卸载程序时增加一些开关。在你可能想删除所有东西并重新开始使用 Flatpak 的情况下,这是必要的。

要卸载和删除特定应用程序的数据,请使用以下命令。例如:

flatpak uninstall -y --delete-data org.kde.kdenlive

要卸载和删除所有与 Flatpak 相关的东西,请使用下面的命令:

flatpak uninstall --all --delete-data

12、清理和磁盘空间的使用

默认情况下,Flatpak 被安装在 /var/lib/flatpak。这个目录包含所有与 Flatpak 相关的数据和元数据以及运行时文件。而用户特定的安装目录是 ~/.local/share/flatpak

你可以用以下命令找出 Flatpak 应用程序使用的磁盘空间。

du -h /var/lib/flatpak

要清理,你可以使用上面提到的 --unused--uninstall 开关。详情请访问我们的 Flatpak 清理指南

总结

为了便于你随时参考,这里是对上面解释的 flatpak 命令的一个总结。把这个页面收藏起来,以便于参考。

# 安装和运行
flatpak install org.kde.kdenlive
flatpak run org.kde.kdenlive

# 列出已安装的 Flatpak 应用程序
flatpak list
flatpak --user list
flatpak --columns=app,name,size,installation list
flatpak --columns=name,size --user list

# 找出应用 ID 和命令历史
flatpak info org.kde.kdenlive
flatpak history

# 更新 Flatpak 应用程序
flatpak update
flatpak update --app org.kde.kdenlive

# 删除 Flatpak 应用程序
flatpak uninstall org.kde.kdenlive
flatpak uninstall --unused

# 删除应用及数据(小心使用)
flatpak uninstall --all
flatpak uninstall -y --delete-data org.kde.kdenlive
flatpak uninstall --all --delete-data

最后,请在评论框中告诉我,你认为还有哪些 Flatpak 命令也应该包括在这个列表中。

一些例子来自官方参考资料


via: https://www.debugpoint.com/flatpak-commands/

作者:Arindam 选题:lkxed 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在 Ubuntu 中想安装一个软件包的一个特别指定的版本?你可以通过下面的方式来轻松地完成:

sudo apt install package_name=package_version

你如何知道某个软件包有哪些可用的版本?可以使用这个命令:

apt list --all-versions package_name

在下面的屏幕截屏中,你可以看到,我有两个可用的 VLC 版本,我使用命令来安装较旧的版本:

install specific versions apt ubuntu

听起来像一个简单的任务,对吧?但是事情并非看起来那么简单。这里有一些不确定是否会出现,但是可能会涉及的东西。

这篇教程将涵盖使用 aptapt-get 命令来安装一个具体指定的程序的版本的所有的重要的方面。

安装一个具体指定版本的程序需要知道的事

在基于 Ubuntu 和 Debian 发行版中,你需要知道一些关于 APT 和存储库是如何工作的知识。

同一个软件包源没有较旧的版本

Ubuntu 在其存储库中不保留较旧版本的软件包。在特殊的情况下,你可以暂时性地看到多个版本。例如,你运行 APT 更新(但不升级)时,可能会有一个可用的新版本。在 APT 缓存中,你可以看到同一个软件包的两个版本。但是,一旦软件包被升级到了新的版本,较旧版本的软件包将从 APT 缓存 和存储库中移除。

使用多个软件包源来使用不同的版本

为获取同一个的软件包的多个版本,你必须得添加多个软件包源。例如,VLC 是版本 3.x 系列。添加 VLC 每日构建 PPA 将会提供(不稳定的)版本 4.x 系列。

同样,你可以下载不同版本的 DEB 文件,并安装它

较高版本编号的版本通常有优先权

如果你有来自多个软件包源的相同名称的软件,默认情况下,Ubuntu 将安装可用的最高版本编号的版本。

在前面的示例中,如果我安装 VLC ,那么它将会安装 4.x 系列的版本,而不是 3.x 系列的版本。

较旧版本将升级到可用的较新版本

这是另外一个可能存在的问题。即使你安装较旧版本的软件包,它也会升级到较新的版本(如果存在可用的较新版本)。你必须 保留该软件包来防止其升级

依赖关系也需要安装

如果软件包有依赖关系,你也需要安装必要的依赖关系软件包。

现在,你已经知道一些可能存在的问题,让我们看看如何解决它们。

安装一个软件包的具体指定版本

在这篇教程中,我将以 VLC 为例。在 Ubuntu 的存储库中可获得 VLC 版本。我添加了每日构建 PPA ,它将向我提供 VLC 的 4.0 版本的候选版本。

如你所见,在现在的系统中,我有两个可用的 VLC 版本:

install specific versions apt ubuntu

~$ apt list -a vlc
Listing... Done
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 i386

因为较高版本编号版本有优先权,使用 apt install vlc 命令将会导致安装 VLC 的 4.0 版本。但是,因为这篇教程的缘由,我想安装较旧的版本 3.0.16 。

sudo apt install vlc=3.0.16-1build7

但是,这里会有这样的事。VLC 软件包有一些依赖关系,并且这些依赖关系也需要具体指定的版本。因此,在 Ubuntu 为其尝试安装最新的版本时,你将会遇到经典的 你已保留残缺软件包 you have held broken packages 错误。

problem installing specific version apt ubuntu

为修复这个错误,你需要为其提供它所投诉的所有依赖关系的软件包的具体指定版本。因此,该命令会变成这样:

sudo apt install vlc=3.0.16-1build7 \
         vlc-bin=3.0.16-1build7 \
         vlc-plugin-base=3.0.16-1build7 \
         vlc-plugin-qt=3.0.16-1build7 \
         vlc-plugin-video-output=3.0.16-1build7 \
         vlc-l10n=3.0.16-1build7 \
         vlc-plugin-access-extra=3.0.16-1build7 \
         vlc-plugin-notify=3.0.16-1build7 \
         vlc-plugin-samba=3.0.16-1build7 \
         vlc-plugin-skins2=3.0.16-1build7 \
         vlc-plugin-video-splitter=3.0.16-1build7 \
         vlc-plugin-visualization=3.0.16-1build7

说明一下,每行结尾处的 \ 只是用来将多行命令来写入同一个命令的一种方式。

它有作用吗?在很多情况下,它是有作用的。 但是,我选择了一个复杂的 VLC 示例,它有很多依赖关系。甚至这些所涉及的依赖关系也依赖于其它的软件包。所以,它就变得令人难以处理。

一种替代的方法是在安装时指定软件包源。

替代方式,指定存储库

你已经添加多个软件包源,因此,你应该对这些软件包的来源有一些了解。

使用下面的命令来搜索存储库:

apt-cache policy | less

注意存储库名称后面的行:

500 http://security.ubuntu.com/ubuntu jammy-security/multiverse i386 Packages
     release v=22.04,o=Ubuntu,a=jammy-security,n=jammy,l=Ubuntu,c=multiverse,b=i386
     origin security.ubuntu.com

你可以具体指定 ola 等参数。

在我原来的示例中,我想安装来自 Ubuntu 存储库的 VLC(获取版本 3.16),而不是安装来 PPA 的版本(它将向我提供版本 4)。

因此,下面的命令将安装 VLC 版本 3.16 及其所有的依赖关系:

sudo apt install -t "o=ubuntu" vlc

install from repository source

看起来令人满意?但是,当你必须更新系统时,问题就来了。它接下来会控诉找不到指定的软件包版本。

还能做什么?

为安装较旧的软件包版本,从你的系统中移除较新版本的软件包源(如果可能的话)。它将有助于逃脱这些依赖关系地狱。

如果不能这么做,检查你是否可以从其它一些软件包的打包格式来获取,像 Snap、Flatpak、AppImage 等等。事实上,Snap 和 Flatpak 也允许你从可用的版本中选择和安装。因为这些应用程序是沙盒模式的,所以它很容易管理不同版本的依赖关系。

保留软件包,防止升级

如果你完成安装一个指定的程序版本,你可能想避免意外地升级到较新的版本。实现这一点并不太复杂。

sudo apt-mark hold package_name

你可以免除保留软件包,以便它能稍后升级:

sudo apt-mark unhold package_name

注意,软件包的依赖关系不会自动地保留。它们需要单独地指明。

结论

如你所见,安装选定软件包版本有一定之规。只有当软件包有依赖关系时,那么事情就会变得复杂,然后,你就会进入依赖关系地狱。

我希望你在这篇教程中学到一些新的东西。如果你有问题或建议来改善它,请在评论区告诉我。


via: https://itsfoss.com/apt-install-specific-version-2/

作者:Abhishek Prakash 选题:lkxed 译者:robsean 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如果你使用 apt 命令在终端中安装软件包,你将看到各种输出。

如果你注意并查看输出,有时你会注意到一条消息:

package_name set to manually installed

你有没有想过这条消息是什么意思,为什么你没有在所有包上看到它?让我在本篇中分享一些细节。

理解 “软件包被标记为手动安装”

当你尝试安装已安装的库或开发包时,你会看到此消息。此依赖包是与另一个包一起自动安装的。如果删除了主包,则使用 apt autoremove 命令删除依赖包。

但是由于你试图显式安装依赖包,你的 Ubuntu 系统认为你需要这个包独立于主包。因此,该软件包被标记为手动安装,因此不会自动删除。

不是很清楚,对吧?以 在 Ubuntu 上安装 VLC 为例。

由于主 VLC 包依赖于许多其他包,因此这些包会自动安装。

installing vlc with apt ubuntu

如果你检查名称中包含 vlc已安装软件包列表,你会看到除了 VLC,其余都标记为“自动”。这表明这些软件包是(跟着 vlc)自动安装的,当 VLC 被卸载时,它们将使用 apt autoremove 命令自动删除。

list installed packages vlc ubuntu

现在假设你出于某种原因考虑安装 vlc-plugin-base。如果你在其上运行 apt install 命令,系统会告诉你该软件包已安装。同时,它将标记从自动更改为手动,因为系统认为在尝试手动安装表明你明确需要此 vlc-plugin-base

package set manually

可以看到它的状态已经从 [installed,automatic] 变成了 [installed]

listing installed packages with vlc

现在,让我删除 VLC 并运行 autoremove 命令。你可以看到 vlc-plugin-base 不在要删除的软件包列表中。

autoremove vlc ubuntu

再次检查已安装软件包的列表。vlc-plugin-base 仍然安装在系统上。

listing installed packages after removing vlc

你可以在这里看到另外两个与 VLC 相关的包。这些是 vlc-plugin-base 包的依赖项,这就是为什么它们也存在于系统上但标记为 automatic 的原因。

我相信现在有了这些例子,事情就更清楚了。让我给你一个额外的技巧。

将包重置为自动

如果包的状态从自动更改为手动,你可以通过以下方式将其设置回自动:

sudo apt-mark auto package_name

set package to automatic

结论

这不是一个重大错误,也不会阻止你在系统中进行工作。但是,了解这些小事会增加你的知识。

好奇心可能会害死猫,但它会让企鹅变得更聪明。这是为这篇原本枯燥的文章增添幽默感的原始引述 : )

如果你想阅读更多这样的文章,这些文章可能看起来微不足道,但可以帮助你更好地了解您的 Linux 系统,请告诉我。


via: https://itsfoss.com/package-set-manually-installed/

作者:Abhishek Prakash 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出