Next: , Previous: , Up: Управление пакетами   [Contents][Index]


4.2 Вызов guix package

Команда guix package — инструмент, который позволяет пользователям устанавливать, обновлять и удалять пакеты, а также откатываться до предыдущих конфигураций (see Особенности). Его синтаксис:

guix package options

В первую очередь, options (опции) задают операции, которые нужно выполнить в транзакции. По завершении создаётся новый профиль, а предыдущие поколения (generations) профиля остаются доступными, если пользователь решит откатиться.

Например, чтобы удалить lua и устанвоить guile и guile-cairo в одной транзакции, напечатайте:

guix package -r lua -i guile guile-cairo

Для вашего удобства мы также предоставляем следующие синонимы:

Эти синонимы не такие мощные, как guix package, и предоставляют меньше опций, так что в некоторых случаях вам скорее нужно пользоваться непосредственно guix package.

guix package также поддерживает декларативный подход, с помощью которого пользователь зааёт точный набор пакетов, которые должны быть доступны, и передаёт его в опции --manifest (see --manifest).

Для каждого пользователя автоматически создаётся символическая ссылка на профиль по умолчанию, она располагается в файле $HOME/.guix-profile. Эта ссылка всегда указывает на текущее поколение пользовательского профиля по умолчанию. Так пользователи могут добавить $HOME/.guix-profile/bin в свою переменную окружения PATH и прочее. Если вы не используете систему Guix, предполагается добавление следующих строк в ваш ~/.bash_profile (see Bash Startup Files in The GNU Bash Reference Manual), чтобы порождаемые оболочки получили все необходимые определения переменных окружения:

GUIX_PROFILE="$HOME/.guix-profile" ; \
source "$HOME/.guix-profile/etc/profile"

В случае многопользовательской установки, профили пользователей сохраняются в месте, которое зарегстрировано как garbage-collector root, которое указывет на $HOME/.guix-profile (see Вызов guix gc). Эта директория обычно ссылается на localstatedir/guix/profiles/per-user/user, где localstatedir — значение, переданное скрипту configure опцией --localstatedir, а user — имя пользователя. Директория per-user создаёся, когда запускается guix-daemon, а поддиректория user создаётся guix package.

Опции options могут быть следующими:

--install=package
-i package

Установить заданный пакет.

Каждый package может задавать простое имя пакета, как например, guile, или имя пакета с указанием номера версии, например, guile@1.8.8 или просто guile@1.8 (в последнем случае выбирается самая новая версия с префиксом 1.8.)

Если не задан номер версии, тогда будет выбрана самая новая доступная версия. Добавм, что package может содержать двоеточие и одно имя выходных данных пакета, как gcc:doc или binutils@2.22:lib (see Пакеты со множественным выходом). Пакеты с соответствующим именем (и опционально, версией) будут отыскиваться в модулях дистрибутива GNU (see Пакетные модули).

Иногда пакеты имеют распространённые входные данные (propagated inputs) — это зависимости, которые устанавливаются автоматически вместе с требуемыми пакетами (см. see propagated-inputs in package objects для подробной информации о распространяемых входных днных в определениях пакетов).

Примером является библиотека GNU MPC: его файлы заголовков C ссылаются на файлы библиотеки GNU MPFR, которые в свою очередь, ссылаются на библиотеку GMP. Так при установке MPC, также в профиль будут устанволены библиотеки MPFR и GMP; удаление MPC также удалит MPFR и GMP, если конечно, они не были явно установлены пользователем.

Кроме того, пакеты иногда зависят от переменных окружения — от их путей поиска (смотрите разъяснение --search-paths ниже). Любая отсутствующая или, возможно, некорректная переменная окружения вызывает сообщение отчета.

--install-from-expression=exp
-e exp

Устанавить пакет, соответствующий exp.

exp должно быть выражением Scheme, которое определяет объект <package>. Эта опция полезна, чтобы указать однозначно пакет, который имеет схожие варианты имён, например, выражением (@ (gnu packages base) guile-final).

Отметим, что эта опция устанавливает первое содержимое пакета, чего может быть недостаточно, если нужен специфичный выход пакета со множественным выходом.

--install-from-file=file
-f file

Устанавить пакет, который определён в файле.

Например, file может содержать содержать определение (see Описание пакетов):

(use-modules (guix)
             (guix build-system gnu)
             (guix licenses))

(package
  (name "hello")
  (version "2.10")
  (source (origin
            (method url-fetch)
            (uri (string-append "mirror://gnu/hello/hello-" version
                                ".tar.gz"))
            (sha256
             (base32
              "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"))))
  (build-system gnu-build-system)
  (synopsis "Hello, GNU world: An example GNU package")
  (description "Guess what GNU Hello prints!")
  (home-page "http://www.gnu.org/software/hello/")
  (license gpl3+))

Пользователи могут найти полезным включить подобный файл guix.scm в корень дерева своего проекта исходного кода, и он будет использоваться для тестирования разработки снепшотов и для создания воспроизводимого окружения разработки (see Запуск guix environment).

--remove=package
-r package

Удалить обозначенный пакет.

Касаемо --install, каждый пакет package может задавать номер версии и имя содержимого в добавлении к имени пакета. Например, -r glibc:debug удалит содержимое debug из glibc.

--upgrade[=regexp …]
-u [regexp …]

Обновить все устанволенные пакеты. Если задано одно или более значений regexp, обновление затронет только пакеты, которые соответствуют regexp. Также смотрите опцию --do-not-upgrade ниже.

Отметим, что это обновляет пакеты, которые установлены в системе, до последних версий, имеющихся в дистрибутиве. Чтобы обновить дистрибутив, нужно регулярно запускать guix pull (see Запуск guix pull).

--do-not-upgrade[=regexp …]

При совместном использовании с опцией --upgrade не обновляет ни один пакет, чьё имя соответствует regexp. Например, обновить все пакеты в текущем профиле , кроме тех, которые содержат подстроку "emacs":

$ guix package --upgrade . --do-not-upgrade emacs
--manifest=file
-m file

Создаёт новую версию профиля из объекта манифеста, возвращаемого кодом Scheme в file. Этот параметр можно указывать несколько раз. В результате манифесты будут объединены в один.

Это позволяет вам описать содержимое профиля вместо того, чтобы собирать его последовательностью команд --install и других. Преимущество в том, что file может подчиняться контролю версиями, копироваться на другие машины, чтобы повторить такой же профиль и т.д.

file должен возвращать объект manifest, который, грубо говоря, является списком пакетов:

(use-package-modules guile emacs)

(packages->manifest
 (list emacs
       guile-2.0
       ;; Use a specific package output.
       (list guile-2.0 "debug")))

В этом примере мыдолжны знать, какие модули содержат определения переменных emacs и guile-2.0, чтобы написать правильную строку use-package-modules, что может быть затруднительно. Вместо этого мы можем обозначить обычные спецификации пакетов и сделать, чтобы specifications->manifest искал соответствующие объекты пакетов так:

(specifications->manifest
 '("emacs" "guile@2.2" "guile@2.2:debug"))
--roll-back

Откатиться до предыдущего поколения профиля, то есть отменить последнюю транзакцию.

При сочетании с опциеями как --install, откат выполняется до всех прочих действий.

При откате от первого поколения, которое по факту содержит установленные пакеты, профиль будет указывать на нулевое поколение, которое не содержит файлы, кроме собственных метаданных.

После выполнения отката, установка, удаление или обновление пакетов по факту заменяет прежние будущие поколения. То есть история поколений в профиле всегда линейная.

--switch-generation=pattern
-S pattern

Переключиться на определённое поколение, опрделённое pattern.

pattern может быть либо номером поколения или числом с префиксом "+" или "-". Последнее означает сменить вперёд/назад на обозначенное число поколений. Например, если вы хотите вернуться к последнему поколению после --roll-back, используйте --switch-generation=+1.

Разница между --roll-back и --switch-generation=-1 заключается в том, что --switch-generation не создаёт нулевое поколение, так что если заданное поколение не существует, текущее поколение не будет изменено.

--search-paths[=kind]

Вывести отчёт об определениях переменных окружения в синтаксисе Bash. Это может понадобиться для использования набора установленных пакетов. Эти переменные окружения используются некоторыми установленными пакетами для поиска файлов.

Например, для GCC должны быть определены переменные окружения CPATH и LIBRARY_PATH, чтобы он мог искать заголовки и библиотеки в профиле пользователя (see Environment Variables in Using the GNU Compiler Collection (GCC)). Если GCC и, скажем, библиотека C установлены в профиле, тогда --search-paths предложит установить эти переменные в profile/include и profile/lib соответственно.

Обычный способ определить эти переменные окружения в оболочке:

$ eval `guix package --search-paths`

Вид kind может быть либо точный адрес exact, либо префикс prefix, либо суффикс suffix, то есть возвращаемые переменные окружения могут быть либо точными, либо префиксами и суффиксами текущего значения этих переменных. При пропуске вид kind по умолчанию выбирается точный exact.

Эта опция также может использоваться для вычисления комбинированных путей поиска нескольких профилей. Рассмотрим пример:

$ guix package -p foo -i guile
$ guix package -p bar -i guile-json
$ guix package -p foo -p bar --search-paths

Последняя команда выше составляет отчёт о переменной GUILE_LOAD_PATH, даже если по отдельности ни foo, ни bar не предшествуют рекомендациям.

--profile=profile
-p profile

Использовать profile вместо пользовательского профиля по умолчанию.

profile must be the name of a file that will be created upon completion. Concretely, profile will be a mere symbolic link (“symlink”) pointing to the actual profile where packages are installed:

$ guix install hello -p ~/code/my-profile
…
$ ~/code/my-profile/bin/hello
Hello, world!

All it takes to get rid of the profile is to remove this symlink and its siblings that point to specific generations:

$ rm ~/code/my-profile ~/code/my-profile-*-link
--list-profiles

List all the user’s profiles:

$ guix package --list-profiles
/home/charlie/.guix-profile
/home/charlie/code/my-profile
/home/charlie/code/devel-profile
/home/charlie/tmp/test

When running as root, list all the profiles of all the users.

--allow-collisions

Разрешить соперничающие пакеты в новом профиле. Используйте на свой собственный страх и риск!

По умолчанию guix package делает отчёт о противоречиях collisions в профиле. Противоречия происходят, когда дви или более разных версии или варианта данного пакета присутсвуют в профиле.

--bootstrap

Использовать бутстрап Guile для сборки профиля. Эта опция полезна только разработчикам дистрибутива.

В дополнение к этим действиям guix package поддерживает следующие опции при обращении к текущему состоянию профиля или для проверки доступности пакетов:

--search=regexp
-s regexp

Вывести список пакетов, чьи имена или описания содержат выражение regexp с учётом регистра, упорядоченные по соответствию. Печать всех метаданных соответствующих пакетов в формате recutils (see GNU recutils databases in GNU recutils manual).

Это позволяет извлекать заданые поля, используя команду recsel, например:

$ guix package -s malloc | recsel -p name,version,relevance
name: jemalloc
version: 4.5.0
relevance: 6

name: glibc
version: 2.25
relevance: 1

name: libgc
version: 7.6.0
relevance: 1

Также для отображения имён всех доступных пакетов под лицензией GNU LGPL версии 3:

$ guix package -s "" | recsel -p name -e 'license ~ "LGPL 3"'
name: elfutils

name: gmp
…

Также можно уточнить поиск, используя несколько флагов -s в команде guix package или несколько аргументов в guix search. Например, следующая команда возвращает список настольных игр (используя синоним guix search на этот раз):

$ guix search '\<board\>' game | recsel -p name
name: gnubg
…

При пропуске -s game мы получим пакеты программного обеспечения, которые работают с печатными платами (boards); удалив угловые скобки рядом с board, получим пакеты, которые также работают с клавиатурами (keyboards).

А теперь более запутанный пример. Следующая команда ищет библиотеки криптографии, фильтрует библиотеки Haskel, Perl, Python и Ruby и печатает имена и краткие описания найденных пакетов:

$ guix search crypto library | \
    recsel -e '! (name ~ "^(ghc|perl|python|ruby)")' -p name,synopsis

См. See Selection Expressions in GNU recutils manual для подробной информации о регуларяных выражениях selection expressions для recsel -e.

--show=package

Показать детали пакета package из списка доступных пакетов в формате recutils (see GNU recutils databases in GNU recutils manual).

$ guix package --show=python | recsel -p name,version
name: python
version: 2.7.6

name: python
version: 3.3.5

You may also specify the full name of a package to only get details about a specific version of it (this time using the guix show alias):

$ guix show python@3.4 | recsel -p name,version
name: python
version: 3.4.3
--list-installed[=regexp]
-I [regexp]

Вывести текущий список установленных пакетов в заданном профиле, отобразив самый последний установленный пакет последним. Если задано regexp, будут выведены только пакеты, чьи имена содержат regexp.

Для каждого установленного пакета выводит следующие элементы, разделенные табуляцией (tab): имя пакета, строка версии, частью какого пакета является установленный пакет (например, out вывода по умолчанию включает include его заголовки т.д.), а также путь этого пакета на складе.

--list-available[=regexp]
-A [regexp]

List packages currently available in the distribution for this system (see Дистрибутив GNU). When regexp is specified, list only available packages whose name matches regexp.

Для каждого пакета выводит следующие элементы, разделённые табуляцией: его имя, строка версии, часть пакета (see Пакеты со множественным выходом), а также расположение его определения в исходниках.

--list-generations[=pattern]
-l [pattern]

Вывести список поколений (generations) с датами их создания; для каждого поколения отобразить установленные пакеты, самый последний установленный пакет отобразать последним. Отметим, что нулевое поколение никогда не показывается.

Для каждого установленного пакета отображает следующие элементы, разделённые табуляцией: имя пакета, строка версии, частью какого пакета является установленный пакет (see Пакеты со множественным выходом), а также расположение пакета на складе.

Если используется pattern, команда выводит только соответствующие поколения. Правильные паттерны содержат:

--delete-generations[=pattern]
-d [pattern]

Если pattern пропущен, удалит все поголения, кроме текущего.

Эта команда принимает такие же паттерны, как --list-generations. Если pattern задан, удалит соответствующие поколения. Если паттерн pattern задаёт срок, выбираются поколения старше срока. Например, --delete-generations=1m удалит поколения, которые старше одного месяца.

Если текущее поколение попадает под условия паттерна, оно не будет удалено. А также нулевое поокление никогда не удаляется.

Отметим, что удаление поколений делает невозможным откат к ним. Следовательно эта команда должна использоваться внимательно.

Наконец, так как guix package может запускать процессы сборки, она поддерживает все привычные опции сборки (see Стандартные параметры сборки). Она также поддерживает опции трансформации пакетов, как --with-source (see Параметры преобразования пакета). Однако, отметим, что трансформации пакетов теряются после обновлений; чтобы сохранить трансформации при обновлениях, нужно определить собственный вариант пакета в модуле Guile и добавить его в GUIX_PACKAGE_PATH (see Описание пакетов).


Next: , Previous: , Up: Управление пакетами   [Contents][Index]