新聞中心
在 Ubuntu 中想安裝一個(gè)軟件包的一個(gè)特別指定的版本?你可以通過下面的方式來輕松地完成:

sudo apt install package_name=package_version
你如何知道某個(gè)軟件包有哪些可用的版本?可以使用這個(gè)命令:
apt list --all-versions package_name
在下面的屏幕截屏中,你可以看到,我有兩個(gè)可用的 VLC 版本,我使用命令來安裝較舊的版本:
install specific versions apt ubuntu
聽起來像一個(gè)簡(jiǎn)單的任務(wù),對(duì)吧?但是事情并非看起來那么簡(jiǎn)單。這里有一些不確定是否會(huì)出現(xiàn),但是可能會(huì)涉及的東西。
這篇教程將涵蓋使用 apt? 或 apt-get 命令來安裝一個(gè)具體指定的程序的版本的所有的重要的方面。
安裝一個(gè)具體指定版本的程序需要知道的事
在基于 Ubuntu 和 Debian 發(fā)行版中,你需要知道一些關(guān)于 APT 和存儲(chǔ)庫(kù)是如何工作的知識(shí)。
同一個(gè)軟件包源沒有較舊的版本
Ubuntu 在其存儲(chǔ)庫(kù)中不保留較舊版本的軟件包。在特殊的情況下,你可以暫時(shí)性地看到多個(gè)版本。例如,你運(yùn)行 APT 更新(但不升級(jí))時(shí),可能會(huì)有一個(gè)可用的新版本。在 APT 緩存中,你可以看到同一個(gè)軟件包的兩個(gè)版本。但是,一旦軟件包被升級(jí)到了新的版本,較舊版本的軟件包將從 APT 緩存 和存儲(chǔ)庫(kù)中移除。
使用多個(gè)軟件包源來使用不同的版本
為獲取同一個(gè)的軟件包的多個(gè)版本,你必須得添加多個(gè)軟件包源。例如,VLC 是版本 3.x 系列。添加 VLC 每日構(gòu)建 PPA 將會(huì)提供(不穩(wěn)定的)版本 4.x 系列。
同樣,你可以下載不同版本的 DEB 文件,并安裝它。
較高版本編號(hào)的版本通常有優(yōu)先權(quán)
如果你有來自多個(gè)軟件包源的相同名稱的軟件,默認(rèn)情況下,Ubuntu 將安裝可用的最高版本編號(hào)的版本。
在前面的示例中,如果我安裝 VLC ,那么它將會(huì)安裝 4.x 系列的版本,而不是 3.x 系列的版本。
較舊版本將升級(jí)到可用的較新版本
這是另外一個(gè)可能存在的問題。即使你安裝較舊版本的軟件包,它也會(huì)升級(jí)到較新的版本(如果存在可用的較新版本)。你必須 保留該軟件包來防止其升級(jí) 。
依賴關(guān)系也需要安裝
如果軟件包有依賴關(guān)系,你也需要安裝必要的依賴關(guān)系軟件包。
現(xiàn)在,你已經(jīng)知道一些可能存在的問題,讓我們看看如何解決它們。
安裝一個(gè)軟件包的具體指定版本
在這篇教程中,我將以 VLC 為例。在 Ubuntu 的存儲(chǔ)庫(kù)中可獲得 VLC 版本。我添加了每日構(gòu)建 PPA ,它將向我提供 VLC 的 4.0 版本的候選版本。
如你所見,在現(xiàn)在的系統(tǒng)中,我有兩個(gè)可用的 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
因?yàn)檩^高版本編號(hào)版本有優(yōu)先權(quán),使用 apt install vlc 命令將會(huì)導(dǎo)致安裝 VLC 的 4.0 版本。但是,因?yàn)檫@篇教程的緣由,我想安裝較舊的版本 3.0.16 。
sudo apt install vlc=3.0.16-1build7
但是,這里會(huì)有這樣的事。VLC 軟件包有一些依賴關(guān)系,并且這些依賴關(guān)系也需要具體指定的版本。因此,在 Ubuntu 為其嘗試安裝最新的版本時(shí),你將會(huì)遇到經(jīng)典的 你已保留殘缺軟件包 錯(cuò)誤。
problem installing specific version apt ubuntu
為修復(fù)這個(gè)錯(cuò)誤,你需要為其提供它所投訴的所有依賴關(guān)系的軟件包的具體指定版本。因此,該命令會(huì)變成這樣:
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
說明一下,每行結(jié)尾處的 \ 只是用來將多行命令來寫入同一個(gè)命令的一種方式。
它有作用嗎?在很多情況下,它是有作用的。 但是,我選擇了一個(gè)復(fù)雜的 VLC 示例,它有很多依賴關(guān)系。甚至這些所涉及的依賴關(guān)系也依賴于其它的軟件包。所以,它就變得令人難以處理。
一種替代的方法是在安裝時(shí)指定軟件包源。
替代方式,指定存儲(chǔ)庫(kù)
你已經(jīng)添加多個(gè)軟件包源,因此,你應(yīng)該對(duì)這些軟件包的來源有一些了解。
使用下面的命令來搜索存儲(chǔ)庫(kù):
apt-cache policy | less
注意存儲(chǔ)庫(kù)名稱后面的行:
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
你可以具體指定 o、l、a 等參數(shù)。
在我原來的示例中,我想安裝來自 Ubuntu 存儲(chǔ)庫(kù)的 VLC(獲取版本 3.16),而不是安裝來 PPA 的版本(它將向我提供版本 4)。
因此,下面的命令將安裝 VLC 版本 3.16 及其所有的依賴關(guān)系:
sudo apt install -t "o=ubuntu" vlc
install from repository source
看起來令人滿意?但是,當(dāng)你必須更新系統(tǒng)時(shí),問題就來了。它接下來會(huì)控訴找不到指定的軟件包版本。
還能做什么?
為安裝較舊的軟件包版本,從你的系統(tǒng)中移除較新版本的軟件包源(如果可能的話)。它將有助于逃脫這些依賴關(guān)系地獄。
如果不能這么做,檢查你是否可以從其它一些軟件包的打包格式來獲取,像 Snap、Flatpak、AppImage 等等。事實(shí)上,Snap 和 Flatpak 也允許你從可用的版本中選擇和安裝。因?yàn)檫@些應(yīng)用程序是沙盒模式的,所以它很容易管理不同版本的依賴關(guān)系。
保留軟件包,防止升級(jí)
如果你完成安裝一個(gè)指定的程序版本,你可能想避免意外地升級(jí)到較新的版本。實(shí)現(xiàn)這一點(diǎn)并不太復(fù)雜。
sudo apt-mark hold package_name
你可以免除保留軟件包,以便它能稍后升級(jí):
sudo apt-mark unhold package_name
注意,軟件包的依賴關(guān)系不會(huì)自動(dòng)地保留。它們需要單獨(dú)地指明。
結(jié)論
如你所見,安裝選定軟件包版本有一定之規(guī)。只有當(dāng)軟件包有依賴關(guān)系時(shí),那么事情就會(huì)變得復(fù)雜,然后,你就會(huì)進(jìn)入依賴關(guān)系地獄。
新聞標(biāo)題:如何在Ubuntu中安裝具體指定的軟件包版本
本文URL:http://www.dlmjj.cn/article/ccdocjs.html


咨詢
建站咨詢
