如何在 Ubuntu 中安裝具體指定的軟體包版本
在 Ubuntu 中想安裝一個軟體包的一個特別指定的版本?你可以通過下面的方式來輕鬆地完成:
sudo apt install package_name=package_version
apt list --all-versions package_name
在下面的屏幕截屏中,你可以看到,我有兩個可用的 VLC 版本,我使用命令來安裝較舊的版本:
聽起來像一個簡單的任務,對吧?但是事情並非看起來那麼簡單。這裡有一些不確定是否會出現,但是可能會涉及的東西。
這篇教程將涵蓋使用 apt
或 apt-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 版本:
~$ 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 為其嘗試安裝最新的版本時,你將會遇到經典的 你已保留殘缺軟體包 錯誤。
為修復這個錯誤,你需要為其提供它所投訴的所有依賴關係的軟體包的具體指定版本。因此,該命令會變成這樣:
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
你可以具體指定 o
、l
、a
等參數。
在我原來的示例中,我想安裝來自 Ubuntu 存儲庫的 VLC(獲取版本 3.16),而不是安裝來 PPA 的版本(它將向我提供版本 4)。
因此,下面的命令將安裝 VLC 版本 3.16 及其所有的依賴關係:
sudo apt install -t "o=ubuntu" vlc
看起來令人滿意?但是,當你必須更新系統時,問題就來了。它接下來會控訴找不到指定的軟體包版本。
還能做什麼?
為安裝較舊的軟體包版本,從你的系統中移除較新版本的軟體包源(如果可能的話)。它將有助於逃脫這些依賴關係地獄。
如果不能這麼做,檢查你是否可以從其它一些軟體包的打包格式來獲取,像 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
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive