Noticias

Construyamos un complemento juntos: un tutorial de un complejo snapcraft.yaml

Ha pasado un tiempo desde que hablamos sobre cómo crear instantáneas. En el pasado, revisamos muchos ejemplos detallados que destacan diferentes lenguajes de programación y el uso de varios componentes útiles que se pueden declarar en snapcraft.yaml, como extensiones, paquetes de etapa, diseños y más. Hoy, queremos brindarle una descripción general de una instantánea bastante compleja que debería ayudarlo a comenzar su viaje de instantáneas. Echaremos un vistazo a GIMP, mantener una instantánea Bajo el paraguas de Snapcrafters.

La primera sección del archivo snapcraft.yaml declara metadatos que pueden identificar instantáneas o buscar instantáneas en el almacén de instantáneas. La palabra clave icon especifica el nombre de un archivo de imagen disponible en el árbol del proyecto local que se usará cuando se instale Snap.

name: gimp
version: '2.10.30'
summary: GNU Image Manipulation Program
description: |
  Whether you are a graphic designer, photographer, illustrator, or scientist,
  GIMP provides you with sophisticated tools to get your job done. You can
  further enhance your productivity with GIMP thanks to many customization
  options and 3rd party plugins.
icon: gimp.png

La segunda sección del archivo snapcraft.yaml declara algunos parámetros importantes. calificación Define el nivel de estabilidad de la instantánea. Hay dos niveles disponibles: estable y de desarrollo. Las instantáneas en modo de desarrollo no se pueden publicar en canales candidatos o estables en el almacén de instantáneas.

Las instantáneas de GIMP también son Restricciones estrictas, lo que significa que tiene acceso limitado a los recursos del sistema. Más adelante en el archivo, veremos las interfaces, un mecanismo de seguridad que permite que las instantáneas estrictamente restringidas accedan a los recursos del sistema y los utilicen de forma detallada.

grade: stable
confinement: strict
base: core18
compression: lzo

snap usa core18 como su de acuerdo aUna base es un tipo especial de instantánea que actúa como base sobre la cual se ejecutará y ejecutará la instantánea. Por ejemplo, core18 se basa en Ubuntu 18.04 y usa sus bibliotecas para proporcionar el entorno necesario.

compresión Especifica el tipo de algoritmo que se usará para empaquetar los artefactos de instantáneas creados en una instantánea, que es esencialmente un único archivo squashFS con un sufijo .snap. En el pasado se usaba el algoritmo xz, pero recientemente, snap tiene una opción para usar lzo.Si bien proporciona menos compresión (instantáneas más grandes), también ayuda tiempo de inicio más rápido, que es esencial para una buena experiencia de usuario, especialmente en sistemas de escritorio.

Los desarrolladores pueden especificar la arquitectura de destino que desean usar para las instantáneas. De forma predeterminada, las instantáneas se crearán para la plataforma amd64. Es importante asegurarse de que la aplicación pueda construirse y ejecutarse en las arquitecturas requeridas y que todas las dependencias de biblioteca relevantes que deben agruparse en un instante estén presentes y disponibles para esas arquitecturas.

architectures:
- build-on: amd64
- build-on: arm64
- build-on: armhf

Esta sección permite a los desarrolladores mapear directorios y rutas de archivos para presentar aplicaciones en un instante en una estructura similar a los sistemas Linux tradicionales. En algunos casos, esto puede ser necesario porque algunas aplicaciones no son «conscientes de instantáneas» o pueden estar codificadas para usar rutas absolutas que romperían el límite de seguridad de instantáneas. La solución para este problema es usar un diseño y señalar las rutas relevantes a los archivos y directorios de instantáneas internas.

layout:
  /etc/gimp:
    bind: $SNAP/etc/gimp
  /etc/ld.so.cache:
    bind-file: $SNAP_DATA/etc/ld.so.cache
  /usr/lib/$SNAPCRAFT_ARCH_TRIPLET/babl-0.1:
    bind: $SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/babl-0.1
  /usr/lib/$SNAPCRAFT_ARCH_TRIPLET/gegl-0.4:
    bind: $SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/gegl-0.4
...
  /usr/lib/gimp:
    bind: $SNAP/usr/lib/gimp
  /usr/lib/python2.7:
    bind: $SNAP/usr/lib/python2.7
  /usr/lib/gvfs:
    bind: $SNAP/usr/lib/gvfs
...

interfaz de captura Permita (o deniegue) el acceso controlado a los recursos fuera de los límites estrictos de la instantánea. Este mecanismo permite que las instantáneas proporcionen la funcionalidad necesaria sin comprometer el modelo de seguridad. Por ejemplo, las interfaces se pueden usar para acceder a la aceleración de OpenGL, directorios de inicio, redes, reproducción de audio y más.

Cada interfaz consta de dos componentes: complementos y ranuras, siendo los primeros consumidores y los últimos proveedores de recursos. Cuando los desarrolladores declaran uno o más complementos en su snapcraft.yaml, permiten que sus aplicaciones accedan a los componentes relacionados. Los complementos se pueden declarar para todas las aplicaciones en un instante (puede haber varias aplicaciones) o se pueden especificar individualmente para cada aplicación.

Por ejemplo, si la instantánea tiene dos aplicaciones: Rico y bar, es posible que también desee otorgar acceso al directorio de inicio, pero solo permitir el acceso a la red barLuego puede declarar la interfaz de inicio en la sección de enchufes globales, luego solo por bar solicitud.

plugs:
  gtk-3-themes:
    interface: content
    target: $SNAP/data-dir/themes
    default-provider: gtk-common-themes:gtk-3-themes
  sound-themes:
    interface: content
    target: $SNAP/data-dir/sounds
    default-provider: gtk-common-themes:sound-themes
  icon-themes:
    interface: content
    target: $SNAP/data-dir/icons
    default-provider: gtk-common-themes:icon-themes
  gnome-3-28-1804:
    interface: content
    target: $SNAP/data-dir/gnome-platform
    default-provider: gnome-3-28-1804:gnome-3-28-1804

Las instantáneas de GIMP usan temas, sonidos, íconos y otros activos del tema de contenido genérico Gtk, así como otros activos de la plataforma de contenido GNOME 3.28. La elegancia de este enfoque es que permite que las instantáneas de GIMP se entreguen con menos componentes, ahorra espacio, reduce el mantenimiento y, en general, permite que múltiples instantáneas usen partes comunes, lo que mejora la consistencia general de la plataforma.

Asimismo, GIMP snapcraft.yaml declara un espacio de sesión D-BUS, lo que permite la interoperabilidad de las aplicaciones. De esta forma, el software que tenga acceso a los servicios de D-BUS podrá comunicarse con GIMP a través del bus registrado, incluso si se trata de una aplicación aislada y estrictamente restringida.

slots:
  dbus-gimp:
    interface: dbus
    bus: session
    name: org.gimp.GIMP.UI

A veces, las instantáneas pueden tener que hacer cosas dinámicas más allá del proceso de construcción.Esta función puede proporcionar conectar, un conjunto de scripts de shell que se pueden ejecutar en diferentes etapas del ciclo de vida del complemento.

hooks:
  install:
    command-chain:
      - snap/command-chain/desktop-launch
  post-refresh:
    command-chain:
      - snap/command-chain/desktop-launch

En el ejemplo anterior, la instantánea de GIMP tiene dos ganchos, uno que se ejecuta durante la fase de instalación y el otro que se activa después de una actualización (refresco). La ejecución de ganchos está controlada por el servicio snapd.

En particular, el uso de ganchos es muy conveniente para operaciones que no se pueden definir completamente durante el proceso de compilación. Por ejemplo, una instantánea puede requerir una configuración de dispositivo específica que solo se puede generar en el momento de la instalación u otros elementos que el desarrollador no puede proporcionar durante el tiempo de compilación.

Las instantáneas se ejecutan en su propio entorno, aisladas del resto del sistema. Para ello, también cuentan con sus propias variables de entorno. Los desarrolladores pueden establecer variables, a las que la aplicación instantánea accederá y utilizará en tiempo de ejecución.

environment:
  SNAP_DESKTOP_RUNTIME: $SNAP/data-dir/gnome-platform
  GTK_EXE_PREFIX: $SNAP/usr
  GTK_USE_PORTAL: '1'
  GIMP2_LOCALEDIR: $SNAP/usr/share/locale
  LD_LIBRARY_PATH:
$SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/lapack:$SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/blas
  PYTHONPATH:
$SNAP/usr/lib/python2.7:$SNAP/usr/lib/python2.7/site-packages:$PYTHONPATH
  FINAL_BINARY: $SNAP/usr/bin/gimp

La sección de aplicaciones del archivo snapcraft.yaml declara una o más aplicaciones. La mayoría de las instantáneas tienen un binario con el mismo nombre, pero no hay límite en la cantidad de aplicaciones diferentes que se pueden especificar. Cada uno debe tener su ruta (comando) y declaraciones opcionales como ranura, enchufe o archivo de escritorio.

apps:
  gimp:
    command: usr/bin/gimp
    command-chain: [snap/command-chain/desktop-launch]
    desktop: usr/share/applications/gimp.desktop
    common-id: org.gimp.GIMP
    slots:
    - dbus-gimp
    plugs:
    - cups-control
    - browser-support
    - desktop
    - desktop-legacy
    - gsettings
...

GIMP requiere acceso a D-Bus (como definimos en la sección de tragamonedas), así como acceso a escritorio, hogar, web, X11 o Wayland, aceleración 3D, medios extraíbles y otros recursos.

La mayor parte de la mayoría de las instantáneas son declaraciones de partes: la sección donde el desarrollador enumera todos los diferentes componentes que se compilarán, construirán y ensamblarán en la instantánea. Las partes pueden ser cualquier activo, incluidos archivos de origen, paquetes deb, archivos zip, archivos independientes o incluso stubs vacíos que se usan para realizar operaciones de compilación en otras partes.Puede especificar el orden en que se ejecutan las partes, por ejemplo, una parte descarga un activo mientras que otra lo cambia Trasero Está descargado.

Los desarrolladores tienen una flexibilidad considerable en cómo se usan y definen las partes:

  • pueden usar enchufar Para un lenguaje de programación específico o una herramienta de compilación.
  • pueden usar pequeño guión Anule los comandos de creación de widgets predeterminados y realice acciones personalizadas más allá del comportamiento predeterminado de cada complemento.

¡GIMP tiene no menos de 16 secciones! Veamos (solo) algunos de ellos. La primera parte de GIMP yaml hace exactamente eso.usa cero complemento, no hace nada más que las acciones reales se escriben en la sección de anulación-construcción como una serie de comandos de shell BASH como sustituciones de palabras, cambios de permisos, etc. Esto también se puede hacer en los pasos posteriores a la instalación, y no hay forma de que los desarrolladores elijan cómo configurar su complemento.

parts:
  fix-pkgconfig-files:
    plugin: nil
    override-build: |
      cat <<'EOF' > $SNAPCRAFT_PART_INSTALL/fix-pkgconfig-files.sh
      for pcfile in
$SNAPCRAFT_PART_INSTALL/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/pkgconfig/*.pc
$SNAPCRAFT_PART_INSTALL/usr/lib/pkgconfig/*.pc
$SNAPCRAFT_PART_INSTALL/usr/local/lib/$SNAPCRAFT_ARCH_TRIPLET/pkgconfig/*.pc
$SNAPCRAFT_PART_INSTALL/usr/local/lib/pkgconfig/*.pc; do
        sed -i -E "s~^((include|lib)dir=)/usr(/local)?~1\${prefix}~g" $pcfile || true
        sed -i -E "s~^((exec_)?prefix=)(/usr(/local)?)~1/3~" $pcfile || true
      done
      EOF
      chmod +x $SNAPCRAFT_PART_INSTALL/fix-pkgconfig-files.sh
    prime:
    - -*

Otra parte interesante es el lanzamiento de escritorio. El código fuente de esta parte proviene de un directorio local llamado desktop-launch en la carpeta del proyecto snap.esta usando fabricar insertar.Esta sección enumera algunos de los Hospedarse pasos y varios escenario Paquete, que será utilizado por el artefacto binario construido en tiempo de ejecución.

desktop-launch:
    plugin: make
    source: desktop-launch
    build-packages:
      - rsync
      - libgail-dev
      - libgtk-3-dev
      - libgtk2.0-dev
    stage-packages:
      - appmenu-gtk2-module
      - gtk2-engines
      - gtk2-engines-pixbuf
      - libatk-adaptor
      - libcanberra-gtk-module
      - libgail-common
...

Tanto los paquetes de compilación como los de etapa se proporcionan desde los archivos de Ubuntu que coinciden con la base declarada anteriormente en el archivo.Por lo tanto, si un desarrollador utiliza libgail-dev durante la construcción y especificado Núcleo 18 En su snapcraft.yaml, Snapcraft extraerá este archivo del repositorio de Ubuntu 18.04.Así mismo, con núcleo 20, Snapcraft consultará el archivo de Ubuntu 20.04.

Los paquetes de compilación y etapa deben escribirse en la forma correcta que coincida con sus nombres en sus respectivos archivos. Si omite algunos, es posible que vea errores al compilar o que la aplicación no se ejecute. Snapcraft puede adivinar automáticamente algunas dependencias, pero es posible que también deba proporcionar la lista manualmente, lo que requiere una comprensión básica de cómo funciona la aplicación Snap.

La parte de GIMP en sí hace muchas cosas interesantes:

  • esta construido Trasero varios otros componentes.
  • Se compila usando autotools.
  • El archivo fuente se descarga del sitio web oficial y se compila con algunos indicadores de configuración, incluido el nivel de optimización de O2 y los símbolos de depuración.
  • Se enumeran una serie de paquetes de compilación y etapa, incluidas las entradas específicas de la arquitectura.
gimp:
    after:
    - babl
    - desktop-settings-packages
    - gegl
    - gtk-locales
    - libheif
    - libmypaint
    - mypaint-brushes
    plugin: autotools
    source:
https://download.gimp.org/pub/gimp/v2.10/gimp-$SNAPCRAFT_PROJECT_VERSION.tar.bz2
    source-checksum:
sha256/88815daa76ed7d4277eeb353358bafa116cd2fcd2c861d95b95135c1d52b67dc
    configflags:
    - --prefix=/usr
    - --sysconfdir=/etc
    - --with-bug-report-url=https://github.com/snapcrafters/gimp/issues/
    - --with-build-id=org.gimp.GIMP.snapcraft.stable
    - --disable-check-update
    - --disable-docs
    - --disable-gtk-doc
    - --disable-gtk-doc-html
    - --disable-python
    build-environment:
    - CFLAGS: -O2 -g -pipe
    - CXXFLAGS: -O2 -g -pipe
...

En particular, en la lista de paquetes de compilación, Snapcraft tratar Use tres bibliotecas, pero solo en arquitecturas donde esas bibliotecas estén disponibles. Esto hace que snapcraft.yaml sea más compacto sin dejar de apuntar a diferentes plataformas.

   - try:
      - libunwind8 # not available in s390x
      - libfftw3-long3 # only amd64 and i386
      - libfftw3-quad3 # only amd64 and i386

Además, GIMP snapcraft.yaml también crea el motor de conversión de espacio de color y codificación de píxeles babl, el marco de procesamiento de imágenes G’MIC, la biblioteca de procesamiento de imágenes GEGL, los archivos de ayuda y realiza muchas más limpiezas.

¡Esto nos lleva al final del largo y exhaustivo snapcraft.yaml!

Con suerte, este tutorial algo largo arroja luz sobre los entresijos de la creación de instantáneas y hace que el proceso sea más fácil y accesible. Si desea crear su primera instantánea, tal vez pueda comenzar con un proyecto un poco más simple, si está buscando un desafío más complejo, entonces GIMP es un buen lugar para comenzar.Queremos escuchar sus comentarios e ideas, así que únase si quiere compartir algo. nuestro foro Haznos saber.

fotógrafo dominic guadaña existe sin salpicaduras.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Botón volver arriba