У разработчиков есть суперполезный инструмент для управления программами на компьютере — менеджер пакетов. Через него можно ставить и удалять софт, скачивать вспомогательные библиотеки, подтягивать все зависимые библиотеки и обновлять систему.
Пакетные менеджеры выглядят сложновато со стороны, но когда раскуришь их, становится понятно, легко и интересно. Расскажем обо всём этом сегодня.
Что такое пакет и чем он отличается от обычной программы
Пакет — это специальный набор файлов и данных. В пакете содержится:
- сама программа, которую нужно установить;
- файлы с настройкой — куда что копировать;
- информация о том, какие ещё пакеты или библиотеки нужны для установки;
- команды и другие действия, которые нужно будет выполнить во время установки;
- сведения о версии программы.
В обычной программе-установщике всё это тоже есть, но установщик может сам выполнить все необходимые команды и установить программу, а пакет — нет. Для установки и управления пакетами как раз и нужен менеджер пакетов.
Зависимости и менеджер пакетов
Кроме установки, у менеджера пакетов много работы, но основная — распутать все зависимости. Зависимость пакетов — это когда для работы одного пакета требуется установка нескольких других, причём определённых версий.
Допустим, менеджер пакетов ставит пакет «Волшебный веб-сайт за 10 минут», смотрит его зависимости и понимает, что для работы ему нужны:
- база данных MySQL 7-й версии;
- утилита ssh любой версии;
- веб-сервер Apache версии 2.4.0 или позднее.
Менеджер пакетов смотрит в список уже установленных программ и видит, что ssh уже стоит, Apache есть версии 2.4.2, а MySQL вообще не установлена. Это значит, что он первую установку ставит на паузу и начинает качать и устанавливать пакет с MySQL 7-й версии. С ним повторяется то же самое — менеджер смотрит, какие пакеты указаны в зависимостях, качает их и ставит. Как только всё установлено — возвращается к первоначальной задаче и ставит пакет «Волшебный веб-сайт за 10 минут».
При этом может так получиться, что у нас в системе окажется несколько версий базы данных — одна нужна для работы одной программы, а вторая — для другой. Менеджер пакетов запоминает, что кому нужно, и следит за тем, чтобы все пакеты были на месте.
Удаление пакетов
Отдельная задача менеджера пакетов — проследить, чтобы при удалении пакета также удалились и все его зависимости (то, что нужно было ему для работы). Но при этом менеджер посмотрит, а не использует ли другой пакет что-то из этих зависимостей. Если использует — менеджер не будет её удалять, а оставит для другой программы.
Что такое репозиторий
Репозиторий — это место, где хранятся пакеты. Проще говоря, какие-то чужие компьютеры.
Обычно у каждого семейства операционных систем свой репозиторий и свой менеджер пакетов, который с ним работает. Например:
- dpkg — менеджер пакетов для Debian. В репозитории Debian огромное количество пакетов — он работает с 1994 года.
- rpm — менеджер пакетов для RedHat Linux.
- portage — менеджер для Gentoo. Его особенность в том, что все программы компилируются при установке под то железо и процессор, который установлен в системе. Это даёт прирост производительности, но усложняет установку программ.
Почти все менеджеры пакетов работают из командной строки — это стандарт в Linux- и UNIX-системах. Например, команда rpm MySQL-server-standard-5.0.24-0.rhel4.i386.rpm
установит MySQL в Red Hat Linux, а команда emerge --ask dev-db/phpmyadmin
скачает исходные файлы панели управления базы данных и скомпилирует их в Gentoo Linux:
Менеджеры пакетов в программировании
На самом деле мы уже пользовались менеджерами пакетов, когда делали свои проекты:
Здесь мы использовали pip — менеджер пакетов для Python. С его помощью мы устанавливали все необходимые библиотеки, без которых приложение бы не работало. Например, вот что можно сделать с pip:
pip install plotly
— установить библиотеку plotly, чтобы мы могли рисовать графики
pip check pandas
— проверить зависимости у выбранного пакета
pip uninstall telebot
— удалить библиотеку для работы с телеграм-ботом
А для проекта с тепловыми картами твитов Байдена и Трампа нам нужны были три библиотеки, и мы использовали команду pip list, чтобы посмотреть, есть они у нас или нет.
А в проекте с менеджером паролей мы вовсю использовали npm — менеджер пакетов Node.js: с его помощью мы установили Электрон и превратили веб-проект в отдельное приложение:
Вот ещё несколько команд npm:
npm update -g npm
— обновить сам менеджер пакетов
npm install mysql
— установить базу данных MySQL
npm install-test <название пакета>
— установить пакет и проверить тестами его работу
Бытовые менеджеры
В каком-то смысле магазины приложений типа AppStore и RuStore — это тоже менеджеры пакетов:
- Программы хранятся централизованно на каких-то серверах и представлены в каталоге.
- Установкой и обновлением приложений занимается сам магазин приложений.
- Если приложению что-то нужно, магазин сам проверит наличие этого и установит при необходимости.
Вместе с тем на Android и Mac OS можно установить приложения в обход сторов. Кому что удобнее.
Когда менеджера пакетов нет
В Windows каждое приложение отвечает само за себя: если нужно что-то установить, обновить или удалить, вы просто это делаете. С одной стороны, это удобно, а с другой не очень:
- Программы часто связаны между собой, и если вручную удалить одну, сломается другая.
- Если поставить новую версию, то от старой могут остаться ненужные файлы и старые версии, которые будут занимать место.
- При обновлении программа может обновить и свои библиотеки, которые используют другие программы. Но они рассчитывали на старые версии, а с новыми могут перестать работать.
Жить с этим можно, но это не лучший вариант.
Что дальше
Чтобы было интереснее, мы установим Linux в виртуальную машину и поэкспериментируем с менеджером пакетов — посмотрим, что он умеет, чем полезен и как с ним работать.