Next: Запуск guix pack, Previous: Запуск guix shell, Up: Разработка [Contents][Index]
guix environment
The purpose of guix environment
is to assist in creating
development environments.
Deprecation warning: The
guix environment
command is deprecated in favor ofguix 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 Параметры преобразования пакета).
Пользователи иногда ошибочно изменяют переменные
среды, такие как PATH
, в своем ~/.bashrc файле. Как следствие,
когда guix environment
запускает его, Bash может читать
~/.bashrc, тем самым вводя “примеси” в эти переменные среды.
Ошибочно определять такие переменные среды в .bashrc; вместо этого
они должны быть определены в .bash_profile, источником которого
являются только оболочки входа в систему. See Bash Startup Files in The GNU Bash Reference Manual, для получения подробной информации о файлах
запуска Bash.
Например, пакет
fontconfig
просматривает ~/.guix-profile/share/fonts для
дополнительных шрифтов.
Next: Запуск guix pack, Previous: Запуск guix shell, Up: Разработка [Contents][Index]