Next: Подстановки, Previous: Особенности, Up: Управление пакетами [Contents][Index]
guix package
Команда guix package
— инструмент, который позволяет
пользователям устанавливать, обновлять и удалять пакеты, а также
откатываться до предыдущих конфигураций (see Особенности). Его синтаксис:
guix package options
В первую очередь, options (опции) задают операции, которые нужно выполнить в транзакции. По завершении создаётся новый профиль, а предыдущие поколения (generations) профиля остаются доступными, если пользователь решит откатиться.
Например, чтобы удалить lua
и устанвоить guile
и
guile-cairo
в одной транзакции, напечатайте:
guix package -r lua -i guile guile-cairo
Для вашего удобства мы также предоставляем следующие синонимы:
guix search
- синоним guix package -s
,
guix install
- синоним guix package -i
,
guix remove
- синоним guix package -r
,
guix upgrade
— это синоним guix package -u
,
guix show
псевдоним (alias) для guix package --show=
.
Эти синонимы не такие мощные, как 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 "$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 …
Установить заданный пакет.
Each package may specify a simple package name, such as guile
,
optionally followed by an at-sign and version number, such as
guile@3.0.7
or simply guile@3.0
. In the latter case, the
newest version prefixed by 3.0
is selected.
If no version number is specified, the newest available version will be
selected. In addition, such a package specification may contain a
colon, followed by the name of one of the outputs of the package, as in
gcc:doc
or binutils@2.22:lib
(see Пакеты со множественным выходом).
Packages with a corresponding name (and optionally version) are searched for among the GNU distribution modules (see Пакетные модули).
Alternatively, a package can directly specify a store file name such
as /gnu/store/...-guile-3.0.7, as produced by, e.g., guix
build
.
Иногда пакеты имеют распространённые входные данные (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 must be a Scheme expression that evaluates to a <package>
object. This option is notably useful to disambiguate between same-named
variants of a package, with expressions such as (@ (gnu packages
commencement) 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+))
Developers may find it useful to include such a guix.scm file in the
root of their project source tree that can be used to test development
snapshots and create reproducible development environments (see Вызов guix shell
).
file может также содержать JSON-представление одного или нескольких
определений пакетов. Запуск guix package -f
на файле
hello.json со следующим содержимым, установит пакет greeter
после сборки myhello
:
(use-modules (guix) (gnu packages gdb) (gnu packages autotools) (gnu packages texinfo)) ;; Augment the package definition of GDB with the build tools ;; needed when developing GDB (and which are not needed when ;; simply installing it.) (package (inherit gdb) (native-inputs (modify-inputs (package-native-inputs gdb) (prepend autoconf-2.69 automake texinfo))))
--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
).
При обновлении автоматически применяются преобразования пакета, которые были первоначально применены при создании профиля (see Параметры преобразования пакета). Например, предположим, что вы сначала установили Emacs из ветки разработки с помощью:
guix install emacs-next --with-branch=emacs-next=master
В следующий раз, когда вы запустите guix upgrade
, Guix снова
посмотрит на ветку разработки Emacs и соберет новый emacs-next
.
Обратите внимание, что параметры преобразования, такие как --with-branch и --with-source, зависят от внешнего состояния; вам решать, чтобы они работали должным образом. Вы также можете отменить преобразования, которые применяются к пакету, запустив:
guix install package
--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")))
See Writing Manifests, for information on how to write a manifest. See --export-manifest, to learn how to obtain a manifest file from an existing profile.
--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. Это может понадобиться для использования набора установленных пакетов. Эти переменные окружения используются некоторыми установленными пакетами для поиска файлов.
For example, GCC needs the CPATH
and LIBRARY_PATH
environment
variables to be defined so it can look for headers and libraries in the
user’s profile (see Environment Variables in Using the GNU Compiler
Collection (GCC)). If GCC and, say, the C library are installed in the
profile, then --search-paths will suggest setting these variables
to profile/include and profile/lib, respectively
(see Search Paths, for info on search path specifications associated
with packages.)
Обычный способ определить эти переменные окружения в оболочке:
$ 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 должен быть именем файла, который будет создан по завершении. Конкретно profile будет простой символической ссылкой (“символическая ссылка”), указывающей на текущий профиль, в котором установлены пакеты:
$ guix install hello -p ~/code/my-profile … $ ~/code/my-profile/bin/hello Hello, world!
Чтобы избавиться от профиля, нужно удалить символическую ссылку и привязанные к ней элементы, которые указывают на конкретные поколения:
$ rm ~/code/my-profile ~/code/my-profile-*-link
--list-profiles
Перечислить все профили пользователя:
$ guix package --list-profiles /home/charlie/.guix-profile /home/charlie/code/my-profile /home/charlie/code/devel-profile /home/charlie/tmp/test
При запуске от имени root будут перечислены все профили всех пользователей.
--allow-collisions
Разрешить соперничающие пакеты в новом профиле. Используйте на свой собственный страх и риск!
По умолчанию guix package
делает отчёт о противоречиях
collisions в профиле. Противоречия происходят, когда дви или более
разных версии или варианта данного пакета присутсвуют в профиле.
--bootstrap
Использовать бутстрап Guile для сборки профиля. Эта опция полезна только разработчикам дистрибутива.
В дополнение к этим действиям guix package
поддерживает следующие
опции при обращении к текущему состоянию профиля или для проверки
доступности пакетов:
Вывести список пакетов, чьи имена или описания содержат выражение
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
.
Показать детали пакета package из списка доступных пакетов в формате
recutils
(see GNU recutils databases in GNU recutils
manual).
$ guix package --show=guile | recsel -p name,version name: guile version: 3.0.5 name: guile version: 3.0.2 name: guile version: 2.2.7 …
Можно также указать полное имя пакета, чтобы только получить детали его
определённой версии (в этот раз, используя guix show
псевдоним):
$ guix show guile@3.0.5 | recsel -p name,version name: guile version: 3.0.5
Вывести текущий список установленных пакетов в заданном профиле, отобразив самый последний установленный пакет последним. Если задано regexp, будут выведены только пакеты, чьи имена содержат regexp.
Для каждого установленного пакета выводит следующие элементы, разделенные
табуляцией (tab): имя пакета, строка версии, частью какого пакета является
установленный пакет (например, out
вывода по умолчанию включает
include
его заголовки т.д.), а также путь этого пакета на складе.
Вывести список пакетов, доступных на текущий момент в дистрибутиве данной системы (see Дистрибутив GNU). Если задано regexp, выводит только установленные пакеты, чьё имя содержит regexp.
Для каждого пакета выводит следующие элементы, разделённые табуляцией: его имя, строка версии, часть пакета (see Пакеты со множественным выходом), а также расположение его определения в исходниках.
Вывести список поколений (generations) с датами их создания; для каждого поколения отобразить установленные пакеты, самый последний установленный пакет отобразать последним. Отметим, что нулевое поколение никогда не показывается.
Для каждого установленного пакета отображает следующие элементы, разделённые табуляцией: имя пакета, строка версии, частью какого пакета является установленный пакет (see Пакеты со множественным выходом), а также расположение пакета на складе.
Если используется pattern, команда выводит только соответствующие поколения. Правильные паттерны содержат:
Опция --list-generations=1,8,2
выводит три поколения в заданном
пордке. Пробелы и запятые на конце запрещены.
Также можно пропустить конечную точку. Например,
--list-generations=2..
возвращает все поколения, начиная со второго.
--list-generations=20d
отобразит список поколений старше 20 дней.
Если pattern пропущен, удалит все поголения, кроме текущего.
Эта команда принимает такие же паттерны, как
--list-generations. Если pattern задан, удалит
соответствующие поколения. Если паттерн pattern задаёт срок,
выбираются поколения старше срока. Например,
--delete-generations=1m
удалит поколения, которые старше одного
месяца.
Если текущее поколение попадает под условия паттерна, оно не будет удалено. А также нулевое поокление никогда не удаляется.
Отметим, что удаление поколений делает невозможным откат к ним. Следовательно эта команда должна использоваться внимательно.
Напишите в стандартный вывод манифест, подходящий для --manifest, соответствующий выбранному профилю (-ам).
Эта опция предназначена для того, чтобы помочь вам перейти из
“императивного” режима работы—запустив guix install
,
guix upgrade
и т.д.—в декларативный режим, который предлагает
--manifest.
Имейте в виду, что полученный манифест приблизительно соответствует тому, что на самом деле содержится в вашем профиле; например, в зависимости от того, как был создан ваш профиль, он может относиться к пакетам или версиям пакетов, которые не совсем то, что вы указали.
Имейте в виду, что манифест является чисто символическим: он содержит только имена пакетов и, возможно, версии, и их значение со временем меняется. Если вы хотите “привязать” каналы к ревизиям, которые использовались для создания профиля (ов), см. --export-channels ниже.
Вывести на стандартный вывод список каналов, используемых выбранным профилем
(-ями), в формате, подходящем для guix pull --channels
или
guix time-machine --channels
(see Каналы).
Вместе с --export-manifest этот параметр предоставляет информацию, позволяющую копировать текущий профиль (see Копирование Guix).
Однако обратите внимание, что выходные данные этой команды приблизительно используются для создания этого профиля. В частности, один профиль мог быть построен из нескольких различных версий одного и того же канала. В этом случае --export-manifest выбирает последнюю версию и записывает список других ревизий в комментарий. Если вам действительно нужно выбрать пакеты из разных ревизий канала, вы можете использовать подчиненные элементы в своем манифесте для этого (see Младшие версии).
Если вы хотите перейти от “императивной” модели к полностью декларативной модели, состоящей из файла манифеста и файла каналов, закрепляющего точную желаемые версии каналов, то --export-manifest хорошая отправная точка.
Наконец, так как guix package
может запускать процессы сборки, она
поддерживает все привычные опции сборки (see Стандартные параметры сборки). Она
также поддерживает опции трансформации пакетов, как --with-source
(see Параметры преобразования пакета). Однако, отметим, что трансформации
пакетов теряются после обновлений; чтобы сохранить трансформации при
обновлениях, нужно определить собственный вариант пакета в модуле Guile и
добавить его в GUIX_PACKAGE_PATH
(see Описание пакетов).
Next: Подстановки, Previous: Особенности, Up: Управление пакетами [Contents][Index]