安装特定版本的软件包和相关软件包

安装特定版本的软件包和相关软件包

我正在尝试从 Erlang Solutions 存储库安装 Erlang(向下滚动到“使用存储库安装”关于 Erlang 解决方案下载页面

当前版本是 Erlang/OTP-20.0-rc2,但我想要 Erlang 19.3。如果我尝试以下操作:

sudo apt-get install erlang=1:19.3-1

...我收到如下错误:

Reading package lists... Done
Building dependency tree       
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 erlang : Depends: erlang-diameter but it is not going to be installed
          Depends: erlang-eldap but it is not going to be installed
          Recommends: erlang-ic-java but it is not going to be installed
          Recommends: erlang-src but it is not going to be installed
          Recommends: erlang-examples but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

我知道我可以通过以下方法解决这个问题:

sudo apt-get install erlang=1:19.3-1 erlang-diameter=1:19.3-1 erlang-eldap=1:19.3-1

但这要求我提前知道依赖包是什么。

我如何以编程方式(即在 bash 中) 在“一般”情况下能解决这个问题吗?至少对于 Erlang/OTP 来说是这样吗?

注意:我知道我可以sudo apt-get install esl-erlang=1:19.3(除非我使用fkraiem 的回答)。

答案1

你的做法是不对的,因为即使你手动安装了 19.3 版本,下次运行时也会升级到 20* 版本apt upgrade。你应该做的是创建一个/etc/apt/preferences.d/erlang包含以下内容的文件

Package: erlang* esl-erlang
Pin: version 1:19.3*
Pin-Priority: 501

这告诉 Apt,对于名称包含 的所有软件包erlang,以 开头的版本19.3应优先于所有其他版本,甚至更新的版本。然后,简单的apt install erlang应该安装版本 19.3 及其所有正确的依赖项。

答案2

1. 删除以前的 Erlang 版本/包:

$ sudo apt-get purge erlang esl-erlang erlang-base erlang-crypto erlang-eldap erlang-inets erlang-mnesia erlang-os-mon
$ sudo apt-get 自动删除
$ sudo apt-get 安装 -f

$ sudo rm -rf /usr/lib/erlang
$ cd /usr/local/bin
$ sudo rm -f erl
$ sudo rm -f erlc
$ sudo rm -f epmd
$ sudo rm -f run_erl
$ sudo rm -f to_erl
$ sudo rm -f 透析器
$ sudo rm -f 键入器
$ sudo rm -f escript
$ sudo rm -f ct_run

2. 手动添加存储库条目:

  • 要获取 Ubuntu 代号,请输入$ lsb_release -c。在我的例子中,它是赛尼尔

  • $ sudo nano /etc/apt/sources.list并在文件末尾添加以下文本:

# Erlang Solutions
deb https://packages.erlang-solutions.com/ubuntu xenial contrib
  • 创建文件/etc/apt/preferences.d/erlang
$ sudo touch /etc/apt/preferences.d/erlang
$ sudo nano /etc/apt/preferences.d/erlang

内容如下:

Package: erlang* esl-erlang
Pin: version 1:21.3*
Pin-Priority: 501

在哪里21.3是Erlang/OTP的版本。

3.安装Erlang:

$ sudo apt-get 更新
$ sudo apt-get 安装 esl-erlang
$ sudo ln -s /usr/lib/erlang/bin/erl /usr/local/bin/erl

4.检查已安装的Erlang版本:

$ erl -eval '{ok, Version} = file:read_file(filename:join([code:root_dir(), "releases", erlang:system_info(otp_release), "OTP_VERSION"])), io:fwrite(Version), halt().' -noshell

相关内容