Next: , Previous: , Up: Разработка   [Contents][Index]


7.2 Вызов guix environment

The purpose of guix environment is to assist in creating development environments.

Deprecation warning: The guix environment command is deprecated in favor of guix shell, which performs similar functions but is more convenient to use. See Запуск guix shell.

Being deprecated, guix environment is slated for eventual removal, but the Guix project is committed to keeping it until May 1st, 2023. Please get in touch with us at guix-devel@gnu.org if you would like to discuss it.

Основной синтаксис:

guix environment options package

Следующий пример порождает новую оболочку, установленную для разработки GNU Guile:

guix environment guile

Если необходимые зависимости еще не собраны, guix environment автоматически построит их. Среда новой оболочки - это расширенная версия среды, в которой была запущена guix environment. Она содержит необходимые пути поиска для сборки данного пакета, добавленные к существующим переменным среды. Чтобы создать “чистую” среду, в которой исходные переменные среды не были установлены, используйте параметр --pure 14.

Выход из окружения Guix аналогичен выходу из оболочки и возвращает пользователя в старое окружение до вызова guix environment. Следующая сборка мусора (see Вызов guix gc) очистит пакеты, которые были установлены в окружении и больше не используются за ее пределами.

guix environment определяет переменную GUIX_ENVIRONMENT в оболочке, которую создаёт; её значением является имя файла профиля этого окружения. Это позволяет пользователям, скажем, определить специфичные значения окружений разработки в .bashrc (see Bash Startup Files in The GNU Bash Reference Manual):

if [ -n "$GUIX_ENVIRONMENT" ]
then
    export PS1="\u@\h \w [dev]\$ "
fi

... или просмотеть профиль:

$ ls "$GUIX_ENVIRONMENT/bin"

Дополним, что может быть указано более одного пакета, в таком случае используется объединённые входные данные для указанных пакетов. Например, команда ниже порождает оболочку, в котором доступны все зависимости, как Guile, так и Emacs:

guix environment guile emacs

Иногда интерактивная сессия оболочки не нужна. Можно вызвать произвольную команду при указании токена --, который отделяет команду от остальных аргументов:

guix environment guile -- make -j4

In other situations, it is more convenient to specify the list of packages needed in the environment. For example, the following command runs python from an environment containing Python 3 and NumPy:

guix environment --ad-hoc python-numpy python -- python3

Более того, возможно, вам потребуются зависимости пакета, а также некоторые дополнительные пакеты, которые не являются зависимостями процесса сборки или процесса исполнения (работы), но важны при разработке. Для этого и указан флаш --ad-hoc. Пакеты, обозначенные до --ad-hoc интерпретируются как пакеты, чьи зависимости будут добавлены в окружение. Пакеты, которые обозначены после --ad-hoc, интерпретируются как пакеты, которые будут добавлены в окружение непосредственно. Например, следующая команда создаёт окружение разработки Guix, которая в дополнение включает Git и strace:

guix environment guix --ad-hoc git strace

Иногда возникает необходимость изолировать окружение настолько, насколькоо возможно, для максимальной чистоты и воспроизводимости. В частности, при использовании Guix на дистрибутиве, отличном от системы Guix, желательно предотвращать доступ из окружения разработки к /usr/bin и другим ресурсам системы. Например, следующая команда порождает Guile REPL в "контейнере", в котором монтированы только склад и текущая рабочая директория:

guix environment --ad-hoc --container guile -- guile

Примечание: Опция --container требует Linux-libre 3.19 или новее.

Другой типичный вариант использования контейнеров - запуск приложений, чувствительных к безопасности, таких как веб-браузер. Чтобы запустить Eolie, мы должны предоставить доступ к некоторым файлам и каталогам; мы используем nss-certs и предоставляем /etc /ssl /certs/ для аутентификации HTTPS; наконец, мы сохраняем переменную среды DISPLAY, поскольку контейнерные графические приложения не будут отображаться без нее.

guix environment --preserve='^DISPLAY$' --container --network \
  --expose=/etc/machine-id \
  --expose=/etc/ssl/certs/ \
  --share=$HOME/.local/share/eolie/=$HOME/.local/share/eolie/ \
  --ad-hoc eolie nss-certs dbus --  eolie

Доступные опции резюмированы ниже.

--check

Set up the environment and check whether the shell would clobber environment variables. See --check, for more info.

--root=file
-r file

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

Это полезно, если вы хотите защитить своё окружение от сборщика мусора, сделать его "постоянным".

Если эта опция пропущена, окружеие защищено от сборщика мусора только на время сессии guix environment. Это означает, что в следующий раз, когда вы создадите такое же окружение, вам потребуется пересобирать и скачивать пакеты заново. See Вызов guix gc, for more on GC roots.

--expression=expr
-e expr

Создать окружение для пакета или списка пакетов, которые соответствуют выражению expr.

Например, запуск:

guix environment -e '(@ (gnu packages maths) petsc-openmpi)'

запускает оболочку с окружением для этого специфического варианта пакета PETSc.

Запуск:

guix environment --ad-hoc -e '(@ (gnu) %base-packages)'

стартует оболочку со всеми доступными базовыми пакетами.

Команды выше используют только выход по умолчанию обозначенных пакетов. Чтобы выбрать другие выходы, можно указать два элемента кортежей:

guix environment --ad-hoc -e '(list (@ (gnu packages bash) bash) "include")'
--load=file
-l file

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

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

(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.64 automake texinfo))))
--manifest=file
-m file

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

Это то же, что опция с таким же именем в guix package (see --manifest) и использует такие же файлы манифестов.

--ad-hoc

Включить все указанные пакеты в результирующее окружение, если бы целевой (лат. ad hoc) пакет имел бы их как входные данные. Эта опция полезна для быстрого создания окружения без необходимости писать выражение типа пакет, содержащее желаемые входные данные.

Например, команда:

guix environment --ad-hoc guile guile-sdl -- guile

запускает guile в окружении, в котором доступны Guile и Guile-SDL.

Отметим, что этот пример явно запрашивает выходы guile и guile-sdl по умолчанию, но возможно запросить специфичный выход, то есть glib:bin запрашивает выход bin из glib (see Пакеты со множественным выходом).

Эта опция может сочетаться с поведением по умолчанию guix environment. Пакеты, которые появляются до --ad-hoc интерпретируются как пакеты, чьи зависимости будут добавлены в окружение (поведение по умолчанию). Пакеты, которые появляются после этой опции, интерпретируются как пакеты, которые будут добавлены в окружение непосредственно.

--profile=profile
-p profile

Create an environment containing the packages installed in profile. Use guix package (see Вызов guix package) to create and manage profiles.

--pure

Сброс существующих переменных окружения при сборке нового окружения, кроме обозначенных в опции --preserve (смотрите ниже). Эффект этой опции — создание окружения, в котором пути поиска содержат только входные данные пакета.

--preserve=regexp
-E regexp

При использовании вместе с --pure, оставить содержимое переменных окружения, соответствующих выражению regexp — другими словами, включить их в "белый список" переменных окружения, которые не должны обнуляться. Эту опцию можно повторять несколько раз.

guix environment --pure --preserve=^SLURM --ad-hoc openmpi … \
  -- mpirun …

Этот пример запускает mpirun в контексте, в котором определены только следующие переменные окружения: PATH, переменные окружения, чьи имена начинаются с ‘SLURM’, а также обычные "дорогие" переменные (HOME, USER, и т.д.).

--search-paths

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

--system=system
-s system

Попытаться собрать систему system, то есть i686-linux.

--container
-C

Запустить command в изолированном контейнере. Текущая рабочая директория за пределами контейнера отображается внутри контейнера. В дополнение, если это не переопределено опцией --user, тогда настраивается фиктивная домашняя директория, которая совпадает с домашней директорией текущего пользователя, а также соответствующий файл /etc/passwd.

Порождаемый процесс снаружи предстаёт как запущенный от текущего пользователя. Внутри контейнера он имеет такие же UID и GID, что и текущий пользователь, если не обозначена --user (смотрите ниже).

--network
-N

Разделять пространство сетевых имён контейнера с хостящей системой. Контейнеры, созданные без этого флага, могут только иметь доступ к петлевому устройству.

--link-profile
-P

Связать профиль окружения контейнера с ~/.guix-profile внутри контейнера. Это эквивалент запуска команды ln -s $GUIX_ENVIRONMENT ~/.guix-profile внутри контейнера. Связывание завершится ошибкой и отменит создание окружения, если директория уже существует, что, конечно, будет происходить, если guix environment вызвана в домашней директории пользователя.

Определённые пакеты сконфигурированы, чтобы смотреть конфигурационные файлы и данные в ~/.guix-profile;15 --link-profile позволяет этим программам вести себя ожидаемо внутри окружения.

--user=user
-u user

Использовать в контейнере имя пользователя user вместо текущего пользователя. Созданная внутри контейнера запись /etc/passwd будет содержать имя user, домашняя директория будет /home/user, но не будут копированы пользовательские данные GECOS. Более того, внутри контейнера UID и GID будут 1000. user не обязательно должен существовать в системе.

В дополнение, любой разделяемый или расширяемый путь (смотрите --share и --expose соответственно), чьи цели находятся в домашней директории пользователя, будут отображены соответственно в /home/USER; это включает автоматическое отображение текущей рабочей директории.

# will expose paths as /home/foo/wd, /home/foo/test, and /home/foo/target
cd $HOME/wd
guix environment --container --user=foo \
     --expose=$HOME/test \
     --expose=/tmp/target=$HOME/target

Это ограничит утечку данных идентификации пользователя через домашние пути и каждое из полей пользователя. Это один единственный компонент расширенного решения приватности/анонимности — ничто не войдёт, ничто не выйдет.

--no-cwd

Для контейнеров стандартным поведением является разделение текущего рабочего каталога с изолированным контейнером и немедленное переключение на этот каталог в контейнере. Если это нежелательно, --no-cwd приведет к автоматическому доступу к текущему рабочему каталогу not, который изменится на домашний каталог пользователя в контейнере. Смотрите также --user.

--expose=source[=target]
--share=source[=target]

Расширить файловую систему контейнера источником source из хостящей системы в качестве файловой системы только для чтения с целью target внутри контейнера. Если цель target не задана, источник source используется как целевая точка монтирования в контейнере.

Пример ниже порождает Guile REPL в контейнере, в котором домашняя директория пользователя доступна только для чтения через директорию /exchange:

guix environment --container --expose=$HOME=/exchange --ad-hoc guile -- guile

guix environment также поддерживает все обычные опции сборки, которые поддерживает команда guix build (see Стандартные параметры сборки), а также опции трансформации пакета (see Параметры преобразования пакета).


Footnotes

(14)

Пользователи иногда ошибочно изменяют переменные среды, такие как PATH, в своем ~/.bashrc файле. Как следствие, когда guix environment запускает его, Bash может читать ~/.bashrc, тем самым вводя “примеси” в эти переменные среды. Ошибочно определять такие переменные среды в .bashrc; вместо этого они должны быть определены в .bash_profile, источником которого являются только оболочки входа в систему. See Bash Startup Files in The GNU Bash Reference Manual, для получения подробной информации о файлах запуска Bash.

(15)

Например, пакет fontconfig просматривает ~/.guix-profile/share/fonts для дополнительных шрифтов.


Next: , Previous: , Up: Разработка   [Contents][Index]