Рекурсивно перечислить зависимости пакета в Arch Linux.

Вопрос или проблема

Я пытаюсь скачать драйвер из AUR, чтобы установить на недавно установленной системе (без интернет-соединения), однако, когда я ввожу

makepkg -s

Требуются другие пакеты для установки. Так как у этой системы нет интернета, я хотел бы скачать эти пакеты (и все их зависимости) на другом ПК с интернет-соединением, а затем установить на новую систему. Я нашел руководство на сайте archlinux о том, как устанавливать пакеты оффлайн. Используя

pacman -Sp <package_name> > /myPackages.list

Будет создан список всех пакетов, которые я укажу в package_name. Однако мне нужны и все их зависимости. Поэтому я хочу узнать:

  1. Есть ли простой способ сделать это?
  2. Должен ли я вручную вводить команды для каждого зависимого пакета, который требуется?
  3. Можно ли написать скрипт оболочки, чтобы выполнить это? Если да, то как это сделать?

Ответ

Существует программа под названием 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, который отлично справляется с решением зависимостей в случае подключения к интернету. Однако в офлайн-ситуациях этот процесс нужно выполнить вручную.

Задачи, которые необходимо решить:

  1. Получение полного списка всех зависимостей определенного пакета.
  2. Скачивание всех этих пакетов для последующей установки их на офлайн-системе.
  3. Обработка возможных циклических и перекрестных зависимостей.

Пример

В данном случае, на помощь приходит утилита 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

Применение

  1. Команда echo — используется для передачи списка пакетов на вход следующей команде (<package_name> замените на ваши целевые пакеты).

  2. Команда xargs — применяет полученные от echo данные в качестве аргументов для команды pactree. Опция -n 1 указывает xargs выполнять pactree отдельно для каждого пакета.

  3. Команда pactree — анализирует зависимости каждого пакета и выводит их одну на каждую строку.

  4. Команда sort -u — сортирует весь вывод и удаляет дубликаты. Это необходимо, поскольку разные пакеты могут иметь одинаковые зависимости.

  5. Команда pacman -Sp — генерирует URL-ы для скачивания пакетов вместе с их зависимостями и выводит их в файл myPackages.list.

Важные моменты:

  • pacman -Sp не работает для пакетов из AUR, поскольку эти пакеты не являются частью официальных репозиториев Arch.

Заключение

Ситуация, описанная в вопросе, требует применения комбинации стандартных инструментов командной строки Arch Linux для решения задачи рекурсивного разрешения и получения списка зависимостей. Применение команды pactree позволяет вам анализировать зависимости, тогда как использование sort и xargs обеспечивает удобство автоматизированной обработки множества пакетов. Конечно, для пользователей, которые не имеют глубокого опыта работы с оболочкой Linux, этот процесс может показаться сложным и запутанным, но обучение этим командам может значительно упростить установку пакетов в офлайн-режиме.

Оцените материал
Добавить комментарий

Капча загружается...