Next: Invocación de guix pack
, Previous: Invoking guix shell
, Up: Desarrollo [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 Invokingguix 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.
La sintaxis general es:
guix environment opciones paquete…
El ejemplo siguiente lanza un nuevo shell preparado para el desarrollo de GNU Guile:
guix environment guile
Si las dependencias necesarias no están construidas todavía, guix
environment
las construye automáticamente. El entorno del nuevo shell es
una versión aumentada del entorno en el que guix environment
se
ejecutó. Contiene las rutas de búsqueda necesarias para la construcción del
paquete proporcionado añadidas a las variables ya existentes. Para crear un
entorno “puro”, donde las variables de entorno previas no existen, use la
opción --pure18.
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 Invocación de guix gc
) will clean up packages that were installed from within the environment
and are no longer used outside of it.
guix environment
define la variable GUIX_ENVIRONMENT
en el
shell que lanza; su valor es el nombre de archivo del perfil para este
entorno. Esto permite a las usuarias, digamos, definir un prompt para
entornos de desarrollo en su .bashrc (see Bash Startup Files in The GNU Bash Reference Manual):
if [ -n "$GUIX_ENVIRONMENT" ] then export PS1="\u@\h \w [dev]\$ " fi
... o para explorar el perfil:
$ ls "$GUIX_ENVIRONMENT/bin"
Adicionalmente, más de un paquete puede ser especificado, en cuyo caso se usa la unión de las entradas de los paquetes proporcionados. Por ejemplo, la siguiente orden lanza un shell donde todas las dependencias tanto de Guile como de Emacs están disponibles:
guix environment guile emacs
A veces no se desea una sesión interactiva de shell. Una orden arbitraria se
puede invocar usando el valor --
para separar la orden del resto de
los parámetros:
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
Es más, se pueden desear las dependencias de un paquete y también algunos paquetes adicionales que no son dependencias ni en tiempo de construcción ni en el de ejecución, pero son útiles no obstante para el desarrollo. Por esta razón, la opción --ad-hoc es posicional. Los paquetes que aparecen antes de --ad-hoc se interpretan como paquetes cuyas dependencias se añadirán al entorno. Los paquetes que aparecen después se interpretan como paquetes que se añadirán directamente al entorno. Por ejemplo, la siguiente orden crea un entorno de desarrollo Guix que incluye adicionalmente Git y strace:
guix environment --pure guix --ad-hoc git strace
En ocasiones es deseable aislar el entorno tanto como sea posible, para obtener la máxima pureza y reproducibilidad. En particular, cuando se usa Guix en una distribución anfitriona que no es el sistema Guix, es deseable prevenir acceso a /usr/bin y otros recursos del sistema desde el entorno de desarrollo. Por ejemplo, la siguiente orden lanza un REPL Guile en un “contenedor” donde únicamente el almacén y el directorio actual están montados:
guix environment --ad-hoc --container guile -- guile
Nota: La opción --container requiere Linux-libre 3.19 o posterior.
Otro caso de uso típico para los contenedores es la ejecución de
aplicaciones sensibles como navegadores web. Para ejecutar Eolie, debemos
exponer y compartir algunos archivos y directorios; incluimos
nss-certs
y exponemos /etc/ssl/certs/ para la identificación
HTTPS; por último preservamos la variable de entorno DISPLAY
ya que
las aplicaciones gráficas en el contenedor no se mostrarían sin ella.
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
Las opciones disponibles se resumen a continuación.
--check
Set up the environment and check whether the shell would clobber environment variables. See --check, for more info.
--root=archivo
¶-r archivo
Hace que archivo sea un enlace simbólico al perfil para este entorno, y lo registra como una raíz del recolector de basura.
Esto es útil si desea proteger su entorno de la recolección de basura, hacerlo “persistente”.
Cuando se omite esta opción, el entorno se protege de la recolección de
basura únicamente por la duración de la sesión guix
environment
. Esto significa que la siguiente vez que vuelva a crear el
mismo entorno, puede tener que reconstruir o volver a descargar
paquetes. See Invocación de guix gc
, para más información sobre las raíces del
recolector de basura.
--expression=expr
-e expr
Crea un entorno para el paquete o lista de paquetes a los que evalúa expr.
Por ejemplo, ejecutando:
guix environment -e '(@ (gnu packages maths) petsc-openmpi)'
inicia un shell con el entorno para esta variante específica del paquete PETSc.
Ejecutar:
guix environment --ad-hoc -e '(@ (gnu) %base-packages)'
inicia un shell con todos los paquetes básicos del sistema disponibles.
Las órdenes previas usan únicamente la salida predeterminada de los paquetes dados. Para seleccionar otras salidas, tuplas de dos elementos pueden ser especificadas:
guix environment --ad-hoc -e '(list (@ (gnu packages bash) bash) "include")'
--load=archivo
-l archivo
Crea un entorno para el paquete o la lista de paquetes a la que el código en archivo evalúa.
Como un ejemplo, archivo puede contener una definición como esta (see Definición de paquetes):
(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))))
--manifest=archivo
-m archivo
Crea un entorno para los paquetes contenidos en el objeto manifest devuelto por el código Scheme en file. Esta opción se puede repetir varias veces, en cuyo caso los manifiestos se concatenan.
Esto es similar a la opción del mismo nombre en guix package
(see --manifest) y usa los mismos archivos de
manifiesto.
See guix shell --export-manifest
, for
information on how to “convert” command-line options into a manifest.
--ad-hoc
Incluye todos los paquetes especificados en el entorno resultante, como si un paquete ad hoc hubiese sido definido con ellos como entradas. Esta opción es útil para la creación rápida un entorno sin tener que escribir una expresión de paquete que contenga las entradas deseadas.
Por ejemplo, la orden:
guix environment --ad-hoc guile guile-sdl -- guile
ejecuta guile
en un entorno donde están disponibles Guile y
Guile-SDL.
Fíjese que este ejemplo solicita implícitamente la salida predeterminada de
guile
y guile-sdl
, pero es posible solicitar una salida
específica—por ejemplo, glib:bin
solicita la salida bin
de
glib
(see Paquetes con múltiples salidas).
Esta opción puede componerse con el comportamiento predeterminado de
guix environment
. Los paquetes que aparecen antes de
--ad-hoc se interpretan como paquetes cuyas dependencias se
añadirán al entorno, el comportamiento predefinido. Los paquetes que
aparecen después se interpretan como paquetes a añadir directamente al
entorno.
--profile=perfil
-p perfil
Create an environment containing the packages installed in profile.
Use guix package
(see Invocación de guix package
) to create and
manage profiles.
--pure
Olvida las variables de entorno existentes cuando se construye un nuevo entorno, excepto aquellas especificadas con --preserve (véase más adelante). Esto tiene el efecto de crear un entorno en el que las rutas de búsqueda únicamente contienen las entradas del paquete.
--preserve=regexp
-E regexp
Cuando se usa junto a --pure, preserva las variables de entorno que corresponden con regexp—en otras palabras, las pone en una lista de variables de entorno que deben preservarse. Esta opción puede repetirse varias veces.
guix environment --pure --preserve=^SLURM --ad-hoc openmpi … \ -- mpirun …
Este ejemplo ejecuta mpirun
en un contexto donde las únicas
variables de entorno definidas son PATH
, variables de entorno cuyo
nombre empiece con ‘SLURM’, así como las variables “preciosas”
habituales (HOME
, USER
, etc.).
--search-paths
Muestra las definiciones de variables de entorno que componen el entorno.
--system=sistema
-s sistema
Intenta construir para sistema—por ejemplo, i686-linux
.
--container
¶-C
Ejecuta la orden en un contenedor aislado. El directorio actual fuera del contenedor es asociado al interior del contenedor. Adicionalmente, a menos que se fuerce con --user, un directorio de prueba de la usuaria se crea de forma que coincida con el directorio actual de la usuaria, y /etc/passwd se configura adecuadamente.
El proceso lanzado se ejecuta como el usuario actual fuera del contenedor. Dentro del contenedor, tiene el mismo UID y GID que el usuario actual, a menos que se proporcione --user (véase más adelante).
--network
-N
Para contenedores, comparte el espacio de nombres de red con el sistema anfitrión. Los contenedores creados sin esta opción únicamente tienen acceso a la red local.
--link-profile
-P
Para contenedores, enlaza el perfil del entorno a ~/.guix-profile
dentro del contenedor y asigna ese valor a GUIX_ENVIRONMENT
. Es
equivalente a que ~/.guix-profile sea un enlace al perfil real dentro
del contenedor. El enlace fallará e interrumpirá el entorno si el directorio
ya existe, lo cual será probablemente el caso si guix environment
se invocó en el directorio de la usuaria.
Determinados paquetes se configuran para buscar en ~/.guix-profile archivos de configuración y datos;19 --link-profile permite a estos programas operar de la manera esperada dentro del entorno.
--user=usuaria
-u usuaria
Para contenedores, usa el nombre de usuaria usuaria en vez de la actual. La entrada generada en /etc/passwd dentro del contenedor contendrá el nombre usuaria; su directorio será /home/usuaria y ningún dato GECOS de la usuaria se copiará. Más aún, el UID y GID dentro del contenedor son 1000. usuaria no debe existir en el sistema.
Adicionalmente, cualquier ruta compartida o expuesta (véanse --share y --expose respectivamente) cuyo destino esté dentro de la carpeta actual de la usuaria será reasociada en relación a /home/usuaria; esto incluye la relación automática del directorio de trabajo actual.
# expondrá las rutas /home/foo/ddt, /home/foo/prueba y /home/foo/objetivo cd $HOME/ddt guix environment --container --user=foo \ --expose=$HOME/prueba \ --expose=/tmp/objetivo=$HOME/objetivo
Mientras esto limita el escape de la identidad de la usuaria a través de las rutas de sus directorios y cada uno de los campos de usuaria, esto es únicamente un componente útil de una solución de privacidad/anonimato más amplia—no una solución completa.
--no-cwd
El comportamiento predeterminado con contenedores es compartir el directorio de trabajo actual con el contenedor aislado e inmediatamente cambiar a dicho directorio dentro del contenedor. Si no se desea este comportamiento, --no-cwd indica que el directorio actual no se compartirá automáticamente y, en vez de cambiar a dicho directorio, se cambiará al directorio de la usuaria dentro del contenedor. Véase también --user.
--expose=fuente[=destino]
--share=fuente[=destino]
En contenedores, la --expose expone el sistema de archivos fuente del sistema anfitrión como un sistema de archivos de solo-lectura destino dentro del contenedor. --share de la misma manera expone el sistema de archivos con posibilidad de escritura. Si no se especifica destino, fuente se usa como el punto de montaje en el contenedor.
El ejemplo a continuación lanza una sesión interactiva de Guile en un contenedor donde el directorio principal de la usuaria es accesible en modo solo-lectura a través del directorio /intercambio:
guix environment --container --expose=$HOME=/intercambio --ad-hoc guile -- guile
--emulate-fhs
-F
For containers, emulate a Filesystem Hierarchy Standard (FHS) configuration
within the container, see
the official
specification. As Guix deviates from the FHS specification, this option
sets up the container to more closely mimic that of other GNU/Linux
distributions. This is useful for reproducing other development
environments, testing, and using programs which expect the FHS specification
to be followed. With this option, the container will include a version of
glibc
which will read /etc/ld.so.cache
within the container
for the shared library cache (contrary to glibc
in regular Guix
usage) and set up the expected FHS directories: /bin
, /etc
,
/lib
, and /usr
from the container’s profile.
Además, guix environment
acepta todas las opciones comunes de
construcción que permite guix build
(see Opciones comunes de construcción)
así como las opciones de transformación de paquetes (see Opciones de transformación de paquetes).
Las usuarias habitualmente aumentan de forma
incorrecta las variables de entorno como PATH
en su archivo
~/.bashrc. Como consecuencia, cuando guix environment
se
ejecuta, Bash puede leer ~/.bashrc, por tanto introduciendo
“impurezas” en esas variables de entorno. Es un error definir dichas
variables de entorno en ~/.bashrc; en vez de ello deben definirse en
.bash_profile, el cual es únicamente cargado por el shell de ingreso
al sistema. See Bash Startup Files in The GNU Bash Reference
Manual, para detalles sobre los archivos de inicio de Bash.
Por ejemplo, el paquete
fontconfig
inspecciona ~/.guix-profile/share/fonts en busca de
nuevas tipografías.
Next: Invocación de guix pack
, Previous: Invoking guix shell
, Up: Desarrollo [Contents][Index]