Вопрос или проблема
Я пытаюсь скачать драйвер из AUR, чтобы установить на недавно установленной системе (без интернет-соединения), однако, когда я ввожу
makepkg -s
Требуются другие пакеты для установки. Так как у этой системы нет интернета, я хотел бы скачать эти пакеты (и все их зависимости) на другом ПК с интернет-соединением, а затем установить на новую систему. Я нашел руководство на сайте archlinux о том, как устанавливать пакеты оффлайн. Используя
pacman -Sp <package_name> > /myPackages.list
Будет создан список всех пакетов, которые я укажу в package_name
. Однако мне нужны и все их зависимости. Поэтому я хочу узнать:
- Есть ли простой способ сделать это?
- Должен ли я вручную вводить команды для каждого зависимого пакета, который требуется?
- Можно ли написать скрипт оболочки, чтобы выполнить это? Если да, то как это сделать?
Ответ
Существует программа под названием pactree, которая устанавливается вместе с пакетом pacman.
Она используется для отображения дерева зависимостей для указанного пакета.
Вы можете использовать ее следующим образом:
pactree -u <package_name>
Однако, в отличие от pacman -Sp <package_name>
, pactree принимает только одно имя пакета.
Одно из решений
Существует несколько способов обойти эту проблему, но, судя по вашему вопросу, у меня нет ощущения, что вы знакомы с скриптами оболочки (извините, если я ошибаюсь), поэтому я объясню одно решение подробно:
echo "package_name1 package_name2 ..." | xargs -n 1 pactree -u | sort -u | xargs -n 1 pacman -Sp > /myPackages.list
echo
– Встроенная командная оболочка: выводит аргумент на stdout
(с добавленной новой строкой).
|
– Канал: перенаправляет stdout
из левой команды в stdin
правой команды.
xargs
– Внешняя команда: берет stdin
и добавляет его к списку аргументов данной команды.
-n 1
– Опция xargs
: выполняет данную команду один раз для каждого аргумента из stdin
.
pactree
– Внешняя команда: показывает дерево зависимостей для данного пакета.
-u
– Опция pactree
: вместо графика выводит каждый зависимый пакет на отдельной строке.
sort
– Внешняя команда: сортирует текст из stdin
и пишет его в stdout
.
-u
– Опция sort
: удаляет дубликаты из отсортированного stdin
.
(Это необходимо, потому что некоторые пакеты могут иметь одни и те же зависимости.)
С другими частями линии вы уже знакомы.
Примечание
pacman -Sp
выдаст ошибку, если вы дадите ему пакет из AUR.
РЕДАКТИРОВАНО 17.09.2018
Как было указано JdeBP, pactree
теперь находится в пакете pacman-contrib.
.
Ответ или решение
Вопрос о том, как рекурсивно получить список зависимостей пакета в Arch Linux, особенно в ситуации, когда система не имеет доступа к интернету, является довольно распространенной проблемой среди пользователей, пытающихся установить пакеты из Arch User Repository (AUR). Давайте детально рассмотрим, как решить эту задачу, применяя подходы, описанные в вопросе.
Теория
Когда вы сталкиваетесь с необходимостью установить пакет из репозитория AUR на системе без доступа к сети, одной из ключевых задач становится разрешение всех зависимостей данного пакета. В Arch Linux для управления пакетами обычно используется менеджер пакетов pacman
, который отлично справляется с решением зависимостей в случае подключения к интернету. Однако в офлайн-ситуациях этот процесс нужно выполнить вручную.
Задачи, которые необходимо решить:
- Получение полного списка всех зависимостей определенного пакета.
- Скачивание всех этих пакетов для последующей установки их на офлайн-системе.
- Обработка возможных циклических и перекрестных зависимостей.
Пример
В данном случае, на помощь приходит утилита pactree
, которая входит в пакет pacman-contrib
. Эта утилита позволяет визуализировать дерево зависимостей для указанного пакета.
Использование pactree
:
pactree -u <имя_пакета>
Флаг -u
указывает pactree
возвращать список зависимостей в виде строки, где каждая зависимость указана с новой строки, что удобно для дальнейшей обработки.
Тем не менее, pactree
принимает на вход только одно имя пакета, а цель состоит в обработке нескольких пакетов сразу и возможности избегания дублирования пакетов в списке зависимостей.
Для автоматизации вы можете использовать следующую команду:
echo "package_name1 package_name2 ..." | xargs -n 1 pactree -u | sort -u | xargs -n 1 pacman -Sp > /myPackages.list
Применение
-
Команда
echo
— используется для передачи списка пакетов на вход следующей команде (<package_name>
замените на ваши целевые пакеты). -
Команда
xargs
— применяет полученные отecho
данные в качестве аргументов для командыpactree
. Опция-n 1
указываетxargs
выполнятьpactree
отдельно для каждого пакета. -
Команда
pactree
— анализирует зависимости каждого пакета и выводит их одну на каждую строку. -
Команда
sort -u
— сортирует весь вывод и удаляет дубликаты. Это необходимо, поскольку разные пакеты могут иметь одинаковые зависимости. -
Команда
pacman -Sp
— генерирует URL-ы для скачивания пакетов вместе с их зависимостями и выводит их в файлmyPackages.list
.
Важные моменты:
pacman -Sp
не работает для пакетов из AUR, поскольку эти пакеты не являются частью официальных репозиториев Arch.
Заключение
Ситуация, описанная в вопросе, требует применения комбинации стандартных инструментов командной строки Arch Linux для решения задачи рекурсивного разрешения и получения списка зависимостей. Применение команды pactree
позволяет вам анализировать зависимости, тогда как использование sort
и xargs
обеспечивает удобство автоматизированной обработки множества пакетов. Конечно, для пользователей, которые не имеют глубокого опыта работы с оболочкой Linux, этот процесс может показаться сложным и запутанным, но обучение этим командам может значительно упростить установку пакетов в офлайн-режиме.