Next: Запуск guix pack, Up: Разработка [Contents][Index]
guix environment
Цель guix environment
— помощь программистам в создании
окружения разработки, которое можно повторять, без влияния на профили
пакетов. Инструмент guix environment
принимает один или более
пакетов, собирает все входные данные для них и создаёт окружение оболочки
для их использования.
Основной синтаксис:
guix environment options package…
Следующий пример порождает новую оболочку, установленную для разработки GNU Guile:
guix environment guile
Если необходимые зависимости еще не собраны, guix environment
автоматически построит их. Среда новой оболочки - это расширенная версия
среды, в которой была запущена guix environment
. Она содержит
необходимые пути поиска для сборки данного пакета, добавленные к
существующим переменным среды. Чтобы создать “чистую” среду, в которой
исходные переменные среды не были установлены, используйте параметр
--pure 11.
Exiting from a Guix environment is the same as exiting from the shell, and
will place the user back in the old environment before guix
environment
was invoked. The next garbage collection (see Вызов guix gc) will clean up packages that were installed from within the environment
and are no longer used outside of it.
guix environment
defines the GUIX_ENVIRONMENT
variable in
the shell it spawns; its value is the file name of the profile of this
environment. This allows users to, say, define a specific prompt for
development environments in their .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
В других ситуациях удобнее указать список паетов, необходимых для
окружения. Например, следующая команда запускает python
из
окружения, содержащего Python 2.7 и NumPy:
guix environment --ad-hoc python2-numpy python-2.7 -- python
Furthermore, one might want the dependencies of a package and also some additional packages that are not build-time or runtime dependencies, but are useful when developing nonetheless. Because of this, the --ad-hoc flag is positional. Packages appearing before --ad-hoc are interpreted as packages whose dependencies will be added to the environment. Packages appearing after are interpreted as packages that will be added to the environment directly. For example, the following command creates a Guix development environment that additionally includes Git and strace:
guix environment --pure guix --ad-hoc git strace
Иногда возникает необходимость изолировать окружение настолько, насколькоо возможно, для максимальной чистоты и воспроизводимости. В частности, при использовании Guix на дистрибутиве, отличном от системы Guix, желательно предотвращать доступ из окружения разработки к /usr/bin и другим ресурсам системы. Например, следующая команда порождает Guile REPL в "контейнере", в котором монтированы только склад и текущая рабочая директория:
guix environment --ad-hoc --container guile -- guile
Примечание: The --container option requires Linux-libre 3.19 or newer.
Another typical use case for containers is to run security-sensitive
applications such as a web browser. To run Eolie, we must expose and share
some files and directories; we include nss-certs
and expose
/etc/ssl/certs/ for HTTPS authentication; finally we preserve the
DISPLAY
environment variable since containerized graphical
applications won’t display without it.
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
Доступные опции резюмированы ниже.
--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 `(("autoconf" ,autoconf-2.64) ("automake" ,automake) ("texinfo" ,texinfo) ,@(package-native-inputs gdb))))
--manifest=file
-m file
Create an environment for the packages contained in the manifest object returned by the Scheme code in file. This option can be repeated several times, in which case the manifests are concatenated.
Это то же, что опция с таким же именем в 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 Пакеты со множественным выходом).
This option may be composed with the default behavior of guix
environment
. Packages appearing before --ad-hoc are interpreted
as packages whose dependencies will be added to the environment, the default
behavior. Packages appearing after are interpreted as packages that will be
added to the environment directly.
--pure
Unset existing environment variables when building the new environment, except those specified with --preserve (see below). This has the effect of creating an environment in which search paths only contain package inputs.
--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
Run command within an isolated container. The current working directory outside the container is mapped inside the container. Additionally, unless overridden with --user, a dummy home directory is created that matches the current user’s home directory, and /etc/passwd is configured accordingly.
The spawned process runs as the current user outside the container. Inside the container, it has the same UID and GID as the current user, unless --user is passed (see below).
--network
-N
Разделять пространство сетевых имён контейнера с хостящей системой. Контейнеры, созданные без этого флага, могут только иметь доступ к петлевому устройству.
--link-profile
-P
For containers, link the environment profile to ~/.guix-profile
within the container and set GUIX_ENVIRONMENT
to that. This is
equivalent to making ~/.guix-profile a symlink to the actual profile
within the container. Linking will fail and abort the environment if the
directory already exists, which will certainly be the case if guix
environment
was invoked in the user’s home directory.
Certain packages are configured to look in ~/.guix-profile for configuration files and data;12 --link-profile allows these programs to behave as expected within the environment.
--user=user
-u user
Использовать в контейнере имя пользователя user вместо текущего пользователя. Созданная внутри контейнера запись /etc/passwd будет содержать имя user, домашняя директория будет /home/user, но не будут копированы пользовательские данные GECOS. Более того, внутри контейнера UID и GID будут 1000. user не обязательно должен существовать в системе.
Additionally, any shared or exposed path (see --share and --expose respectively) whose target is within the current user’s home directory will be remapped relative to /home/USER; this includes the automatic mapping of the current working directory.
# 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
For containers, the default behavior is to share the current working directory with the isolated container and immediately change to that directory within the container. If this is undesirable, --no-cwd will cause the current working directory to not be automatically shared and will change to the user’s home directory within the container instead. See also --user.
--expose=source[=target]
--share=source[=target]
For containers, --expose (resp. --share) exposes the file system source from the host system as the read-only (resp. writable) file system target within the container. If target is not specified, source is used as the target mount point in the container.
Пример ниже порождает 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.
For example, the fontconfig
package inspects ~/.guix-profile/share/fonts for additional fonts.
Next: Запуск guix pack, Up: Разработка [Contents][Index]