Next: Invocación de guix publish
, Previous: Invocación de guix size
, Up: Utilidades [Contents][Index]
guix graph
Packages and their dependencies form a graph, specifically a directed
acyclic graph (DAG). It can quickly become difficult to have a mental model
of the package DAG, so the guix graph
command provides a visual
representation of the DAG. By default, guix graph
emits a DAG
representation in the input format of Graphviz, so its output can be passed directly to the dot
command
of Graphviz. It can also emit an HTML page with embedded JavaScript code to
display a “chord diagram” in a Web browser, using the
d3.js library, or emit Cypher queries to construct
a graph in a graph database supporting the
openCypher query language. With
--path, it simply displays the shortest path between two packages.
The general syntax is:
guix graph opciones paquete…
Por ejemplo, la siguiente orden genera un archivo PDF que representa el GAD para GNU Core Utilities, mostrando sus dependencias en tiempo de construcción:
guix graph coreutils | dot -Tpdf > gad.pdf
La salida es algo así:
Bonito y pequeño grafo, ¿no?
Puede encontrar más agradable la navegación interactiva del grafo con la
orden xdot
(del paquete xdot
):
guix graph coreutils | xdot -
¡Pero hay más de un grafo! El grafo previo es conciso: es el grafo de los
objetos package, omitiendo las entradas implícitas como GCC, libc, grep,
etc. Es habitualmente útil tener un grafo conciso así, pero a veces una
puede querer ver más detalles. guix graph
implementa varios tipos
de grafos, lo que le permite seleccionar el nivel de detalle:
package
Este es el tipo por defecto usado en el ejemplo previo. Muestra el GAD de objetos package, excluyendo dependencias implícitas. Es conciso, pero deja fuera muchos detalles.
reverse-package
Esto muestra el GAD inverso de paquetes. Por ejemplo:
guix graph --type=reverse-package ocaml
... emite el grafo de paquetes que dependen explícitamente de OCaml
(si también tiene interés en casos donde OCaml es una dependencia implícita,
véase reverse-bag
a continuación).
Fíjese que esto puede producir grafos inmensos para los paquetes básicos. Si
todo lo que quiere saber es el número de paquetes que dependen de uno
determinado, use guix refresh --list-dependent
(see --list-dependent).
bag-emerged
Este es el GAD del paquete, incluyendo entradas implícitas.
Por ejemplo, la siguiente orden:
guix graph --type=bag-emerged coreutils
... emite este grafo más grande:
En la parte inferior del grafo, vemos todas las entradas implícitas de
gnu-build-system (see gnu-build-system
).
Ahora bien, fíjese que las dependencias de estas entradas implícitas—es decir, las dependencias del lanzamiento inicial (see Lanzamiento inicial)—no se muestran aquí para mantener una salida concisa.
bag
Similar a bag-emerged
, pero esta vez incluye todas las dependencias
del lanzamiento inicial.
bag-with-origins
Similar a bag
, pero también muestra los orígenes y sus dependencias.
reverse-bag
Muestra el GAD inverso de paquetes. Al contrario que
reverse-package
, también tiene en cuenta las dependencias
implícitas. Por ejemplo:
guix graph -t reverse-bag dune
... emite el grafo de tosos los paquetes que dependen de Dune, directa o
indirectamente. Ya que Dune es una dependencia implícita de muchos
paquetes vía dune-build-system
, esto mostrará un gran número de
paquetes, mientras que reverse-package
mostraría muy pocos si muestra
alguno.
derivation
Esta es la representación más detallada: muestra el GAD de derivaciones (see Derivaciones) y elementos simples del almacén. Comparada con las representaciones previas, muchos nodos adicionales son visibles, incluyendo los guiones de construcción, parches, módulos Guile, etc.
Para este tipo de grafo, también es posible pasar un nombre de archivo .drv en vez del nombre del paquete, como en:
guix graph -t derivation $(guix system build -d my-config.scm)
module
Este es el grafo de los módulos de paquete (see Módulos de paquetes). Por ejemplo, la siguiente orden muestra el grafo para el módulo
de paquetes que define el paquete guile
:
guix graph -t module guile | xdot -
Todos los tipos previos corresponden a las dependencias durante la construcción. El grafo siguiente representa las dependencias en tiempo de ejecución:
references
Este es el grafo de referencias de la salida de un paquete, como lo
devuelve guix gc --references
(see Invocación de guix gc
).
Si la salida del paquete proporcionado no está disponible en el almacén,
guix graph
intenta obtener la información de dependencias desde
las sustituciones.
Aquí también puede proporcionar un nombre de archivo del almacén en vez de un nombre de paquete. Por ejemplo, la siguiente orden produce el grafo de referencias de su perfil (¡el cuál puede ser grande!):
guix graph -t references $(readlink -f ~/.guix-profile)
referrers
Este es el grafo de referentes de la salida de un paquete, como lo
devuelve guix gc --referrers
(see Invocación de guix gc
).
Depende exclusivamente de información en su almacén. Por ejemplo, supongamos
que la versión actual de Inkscape está disponible en 10 perfiles en su
máquina; guix graph -t referrers inkscape
mostrará un grafo cuya
raíz es Inkscape y con esos 10 perfiles enlazados a ella.
Puede ayudar a determinar qué impide que un elemento del almacén sea recolectado.
Habitualmente el grafo del paquete por el que tiene interés no entrará en su
pantall, y en cualquier caso todo lo que quiere saber es por qué
dicho paquete depende de algún paquete que parece no tener relación. La
opción --path le indica a guix graph
que muestre la ruta
más corta entre dos paquetes (o derivaciones, o elementos del almacén,
etcétera):
$ guix graph --path emacs libunistring emacs@26.3 mailutils@3.9 libunistring@0.9.10 $ guix graph --path -t derivation emacs libunistring /gnu/store/…-emacs-26.3.drv /gnu/store/…-mailutils-3.9.drv /gnu/store/…-libunistring-0.9.10.drv $ guix graph --path -t references emacs libunistring /gnu/store/…-emacs-26.3 /gnu/store/…-libidn2-2.2.0 /gnu/store/…-libunistring-0.9.10
Sometimes you still want to visualize the graph but would like to trim it so
it can actually be displayed. One way to do it is via the
--max-depth (or -M) option, which lets you specify the
maximum depth of the graph. In the example below, we visualize only
libreoffice
and the nodes whose distance to libreoffice
is at
most 2:
guix graph -M 2 libreoffice | xdot -f fdp -
Mind you, that’s still a big ball of spaghetti, but at least dot
can render it quickly and it can be browsed somewhat.
Las opciones disponibles son las siguientes:
Produce un grafo de salida de tipo, donde tipo debe ser uno de los valores enumerados previamente.
Enumera los tipos de grafos implementados.
Produce un grafo usando el motor seleccionado.
Enumera los motores de grafos implementados.
Actualmente, los motores disponibles son Graphviz y d3.js.
Muestra la ruta más corta entre dos nodos del tipo especificado por la
opción --type. El ejemplo siguiente muestra la ruta más corta entre
libreoffice
y llvm
de acuerdo con las referencias de
libreoffice
:
$ guix graph --path -t references libreoffice llvm /gnu/store/…-libreoffice-6.4.2.2 /gnu/store/…-libepoxy-1.5.4 /gnu/store/…-mesa-19.3.4 /gnu/store/…-llvm-9.0.1
Considera el paquete al que evalúa expr
Es útil para hacer una referencia precisa de un paquete concreto, como en este ejemplo:
guix graph -e '(@@ (gnu packages commencement) gnu-make-final)'
Muestra el grafo para sistema—por ejemplo, i686-linux
.
El grafo de dependencias del paquete es altamente independiente de la arquitectura, pero existen algunas partes dependientes de la arquitectura que esta opción le permite visualizar.
Añade directorio al frente de la ruta de búsqueda de módulos de paquetes (see Módulos de paquetes).
Esto permite a las usuarias definir sus propios paquetes y hacerlos visibles a las herramientas de línea de órdenes.
Además de esto, guix graph
permite todas las opciones habituales
de transformación de paquetes (see Opciones de transformación de paquetes). Esto
facilita la visualización del efecto de una transformación de reescritura de
grafo como --with-input. Por ejemplo, la siguiente orden muestra el
grafo de git
una vez que openssl
ha sido reemplazado por
libressl
en todos los nodos del grafo:
guix graph git --with-input=openssl=libressl
¡Tantas posibilidades, tanta diversión!
Next: Invocación de guix publish
, Previous: Invocación de guix size
, Up: Utilidades [Contents][Index]