Установить конкретную версию пакета и связанных пакетов
Я пытаюсь установить Erlang из репозитория Erlang Solutions (прокрутите вниз до раздела "Установка с использованием репозитория" на странице загрузки Erlang Solutions.
Текущая версия - 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 со всеми ее правильными зависимостями.
1. Удалите предыдущие версии / пакеты Erlang:
$ sudo apt-get purge erlang esl-erlang-base erlang-crypto erlang-eldap erlang-inets erlang-mnesia erlang-os-mon $ sudo apt-get autoremove $ sudo apt-get install -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 typer $ sudo rm -f escript $ sudo rm -f ct_run
2. Добавьте запись в репозиторий вручную:
Чтобы получить кодовое имя Ubuntu
$ lsb_release -c
. В моем случае это xenial.$ 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 update $ sudo apt-get install 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