У меня есть двоичное приложение C ++, и я упаковываю его в пакет «deb» на моем Ubuntu 20.04. Этот пакет "deb" имеет несколько зависимостей, которые я определил:
$ dpkg -I my-package-1.0.0.deb
new Debian package, version 2.0.
...
Package: my-package
Version: 1.0.0
Architecture: amd64
Depends: libfreetype6,libgcc-s1,libgl1,libglew2.1,libglvnd0,libglx0,...
...
Этот пакет работает хорошо, за исключением случаев, когда я пытаюсь установить его в Ubuntu 18.04:
$ sudo dpkg -i my-package-1.0.0.deb
Selecting previously unselected package my-package.
(Reading database ... 198305 files and directories currently installed.)
Preparing to unpack my-package-1.0.0.deb ...
Unpacking my-package (1.0.0) ...
dpkg: dependency problems prevent configuration of my-package:
my-package depends on libgcc-s1; however:
Package libgcc-s1 is not installed.
my-package depends on libglew2.1; however:
Package libglew2.1 is not installed.
Эти ошибочные пакеты (libgcc-s1, libglew2.1) не работают. существуют в Ubuntu 18.04 или существуют, но с другой версией. Поэтому у меня общий вопрос: можно ли создать пакет «deb», совместимый с несколькими версиями Ubuntu? Как ? Или единственное решение - создать пакет для каждой версии Ubuntu (и для каждого другого дистрибутива Linux)? Какая стратегия используется чаще всего для создания пакета "deb" при наличии зависимостей?
можно ли создать Пакет "deb" совместим с несколькими версиями Ubuntu? Как ? Или единственное решение - создать пакет для каждой версии Ubuntu (и для каждого другого дистрибутива Linux)? Какая стратегия используется чаще всего для создания пакета «deb» при наличии зависимостей?
Единственное решение - создать пакет для каждой версии Ubuntu (и для каждого другого дистрибутива Linux - даже если в этом случае вы, возможно, не будете создавать .deb
, но .rpm
или любой другой формат, используемый этими дистрибутивами)
Это действительно серьезный недостаток традиционной системы пакетов APT (и конкурирующих систем на Redhat и Arch). Ваше программное обеспечение должно быть скомпилировано для использования версий зависимостей, которые присутствуют в целевой системе.
Это одна из основных причин, по которой разрабатываются новые системы упаковки, такие как Snap, Flatpak и Appimage. Эти системы позволяют упаковать программное обеспечение Linux способом, который значительно меньше зависит от дистрибутива и версии дистрибутива.
Откройте терминал и введите: В Ubuntu 18.04 скопируйте файл my-package-1.0.0.deb на свой рабочий стол. Откройте терминал и введите:
sudo apt update
cd ~/Desktop/
wget http://mirrors.kernel.org/ubuntu/pool/main/g/gcc-10/gcc-10-base_10-20200411-0ubuntu1_amd64.deb http://mirrors.kernel.org/ubuntu/pool/main/g/gcc-10/libgcc-s1_10-20200411-0ubuntu1_amd64.deb http://mirrors.kernel.org/ubuntu/pool/universe/g/glew/libglew2.1_2.1.0-4_amd64.deb
sudo apt install ./gcc-10-base_10-20200411-0ubuntu1_amd64.deb ./libgcc-s1_10-20200411-0ubuntu1_amd64.deb ./libglew2.1_2.1.0-4_amd64.deb
sudo apt install ./my-package-1.0.0.deb
Вышеупомянутые команды также будут работать во всех поддерживаемых в настоящее время версиях Ubuntu. Это удачная ситуация. В общем, не ожидайте, что один набор волшебных команд будет работать на всех поддерживаемых в настоящее время версиях Ubuntu, поскольку зависимости пакетов и требования к версиям зависимостей пакетов могут быть разными для одного и того же пакета в разных выпусках Ubuntu.
В Ubuntu 20.04 пакеты зависимостей уже доступен в репозиториях Ubuntu по умолчанию, так что действия еще проще. Откройте терминал, измените каталоги с помощью cd
на каталог, содержащий my-package-1.0.0.deb, и введите:
sudo apt install ./my-package-1.0.0.deb