为了安装 tmux 2.1,我需要安装libtinfo5
版本 6,我通过下载包含以下内容的 .deb 档案libtinfo5
并直接使用命令进行安装:
sudo dpkg -i libtinfo5_6.0+20160213-1ubuntu1_amd64.deb
这满足了 tmux 2.1 的依赖性,tmux 安装成功。
现在我尝试使用安装 vnstat
sudo apt-get install vnstat
apt-get
错误退出,如下所示
$ sudo apt-get install vnstat
Reading package lists... Done
Building dependency tree
Reading state information... Done
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
libncurses5 : Depends: libtinfo5 (= 5.9+20150516-2ubuntu1) but 6.0+20160213-1ubuntu1 is to be installed
libncursesw5 : Depends: libtinfo5 (= 5.9+20150516-2ubuntu1) but 6.0+20160213-1ubuntu1 is to be installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).
我的理解一直是,Ubuntu 的包管理系统能够安装和管理同一包的多个版本,以应对这种情况。换句话说,apt/dpkg 识别
tmux
需要 libtinfo5 -version 6
才能工作vnstat
需要 libtinfo5 -version 5
才能工作
然后 apt/dpkg 说好的,我将安装两个版本。
我可以看到某些程序(例如系统二进制文件,例如bash
或)ls
只能安装一次,因为大多数调用只是简单地说bash -c "<command>"
而不是bashv.3.2 -c "<command>"
。
所以我的问题是包管理器可以安装和管理多个依赖项吗?或者这是不可能的,因为就像上面的 bash 示例一样,大多数程序通过依赖项名称调用依赖项而不指定版本。在这种情况下,问题超出了包管理器的控制范围(即它更多的是编程编译/配置/组织问题),并且包管理器在那时放弃了?
答案1
不,不可能有两个版本的相同包裹,因为会有冲突的文件。如果图书馆是否能够同时安装两个不同版本则是另一回事。如果你够大胆,你可以获取一个版本的源代码,看看能否将其安装到不同的目录中。这很可能会严重破坏您的系统。它也可能根本不起作用。Dpkg 不会满足,所以你必须获取其中一个程序的源代码并对其进行编译。但请记住一旦您开始自己编译程序,您就会遇到各种各样的问题。
答案2
不可以,您不能同时安装同一软件包的不同版本。依赖关系通常表示为至少版本 X。但是,对于从同一源构建的软件包,依赖关系通常是精确的。这就是您遇到的情况。libncurses5 和 libtinfo5 都是从 ncurses 源包构建的。如果您想升级从此源构建的其中一个软件包,则必须升级所有软件包,因此您只需获取并安装从此源构建的其他软件包的相同版本,这样它们就都处于同一版本。
答案3
我遇到过完全相同的情况,需要同时安装 PacketTracer 8.1.1 和 8.2.0。虽然无法同时安装这两个版本,因为sudo dkpg -i CiscoPacketTracer_820_Ubuntu_64bit.deb
安装标志-i
始终会执行覆盖操作,但将它们都提取到自定义目录并自行创建启动脚本解决了这个问题,并允许我拥有两个不同版本的应用程序。
假设我有这两个版本的 PacketTracer,我想同时使用:
CiscoPacketTracer_811_Ubuntu_64bit.deb
CiscoPacketTracer_820_Ubuntu_64bit.deb
为了保持井然有序,我首先创建了一个自定义目录,/opt
并将其所有权更改为我的用户
sudo mkdir /opt/packettracer
sudo chown sina:sina /opt/packettracer
诀窍是提取档案内容.deb
,而不是进行安装。你可以使用以下命令轻松实现这一点
dpkg -x CiscoPacketTracer_811_Ubuntu_64bit.deb /opt/packettracer/811
dpkg -x CiscoPacketTracer_820_Ubuntu_64bit.deb /opt/packettracer/820
通常情况下,您可以直接运行可执行文件,但情况并非总是如此,您可能会遇到一些错误,尤其是在安装依赖项时。我采取的一个快速解决方法是安装其中一个软件包,这将为sudo gdebi CiscoPacketTracer_811_Ubuntu_64bit.deb
我提供依赖项,但随后我使用删除了已安装的 PacketTracer sudo dpkg -r packettracer
。但我仍然有依赖项。
您还可能会遇到用例特定的问题,即库具有它调用的包装器脚本。我无法谈论每个用例,但对于 PacketTracer,例如,我最终在接受我想要运行的版本的目录的目录start.sh
中创建了一个脚本/opt/packettracer
。
然后我可以直接运行这两个版本
/opt/packettracer/start.sh 811
/opt/packettracer/start.sh 820
dkpg -i
为了完整性,我通过执行经典安装然后输入找到了初始脚本which packettracer
。然后我获取了脚本并将其修改为以下内容:
#!/bin/bash
if [[ ! -d $1 ]]; then
echo "Cannot start packettracer. Invalid directory for first argument! $1";
exit 1;
fi;
echo "Custom Script: Starting Packet Tracer $1"
PREFIX=/opt/packettracer/$1
PTDIR=$PREFIX/opt/pt
export LD_LIBRARY_PATH=$PREFIX/opt/pt/bin
pushd $PREFIX/opt/pt/bin > /dev/null
$PREFIX/opt/pt/bin/PacketTracer "$@" > /dev/null 2>&1
popd > /dev/null