Noticias

Cómo Snapcraft ayuda a los desarrolladores a mapear las dependencias de sus aplicaciones y crear instantáneas de manera eficiente

Uno de los conceptos centrales de las instantáneas es la compatibilidad entre distribuciones. Los desarrolladores pueden crear sus instantáneas una vez y deberían funcionar bien en más de 40 distribuciones de Linux diferentes. Pero, ¿cómo se cuidan todas las dependencias de tiempo de ejecución requeridas? el complemento, como parte del paquete.

En el ecosistema de complemento, la funcionalidad se satisface a través de paquetes de etapa, una lista de bibliotecas y otros componentes de tiempo de ejecución declarados para cada aplicación incluida dentro del complemento. Lo que hace que las cosas sean bastante interesantes es cómo se crea esta lista. En esta publicación de blog, queremos lo llevará a través del viaje del mapeo de dependencias y cómo Snapcraft, la herramienta de línea de comandos utilizada para crear instantáneas, puede ayudarlo en el proceso.

Las instantáneas son archivos autónomos y aislados, diseñados para ejecutarse independientemente del sistema subyacente. chasquido servicio, que permite que las instantáneas se inicien y ejecuten. Desde dentro de la instantánea, las aplicaciones no ven el sistema de archivos del host; en cambio, ven una capa llamada baseun conjunto de bibliotecas que proporciona un entorno funcional mínimo para estas aplicaciones.

Una base está alineada con una de las versiones LTS de Ubuntu. Por ejemplo, core18 está alineada con Ubuntu 18.04 LTS. Esto significa que una compilación rápida con base: core18 «pensará» que se ejecuta sobre Ubuntu 18.04, aunque el sistema operativo externo puede ser Ubuntu 20.04 o quizás Fedora 34.

Además de la base, es posible que los desarrolladores deban declarar dependencias de tiempo de ejecución adicionales, que no se proporcionan en esta capa mínima. Estos serán los paquetes de etapa, que deben declararse para las aplicaciones. La gran pregunta es, ¿cómo se sabe qué agregar?

    stage-packages:
      - ibus-gtk3
      - fcitx-frontend-gtk3
      - gvfs-libs
      - libasound2

Si está familiarizado con la aplicación que está ajustando, lo más probable es que sepa lo que debe incluirse. Aun así, es posible que no esté al tanto de las complejas dependencias, especialmente si compila o incluye kits de herramientas adicionales en su programa.

LEER  Las compilaciones diarias de Ubuntu 23.04 "Lunar Lobster" ya están disponibles para descargar

En el mundo clásico de Linux, una manera fácil de detectar (la mayoría) de las dependencias del tiempo de ejecución es ejecutar el ldd contra un binario, que luego proporcionará una lista de las bibliotecas que necesita el binario. Por lo general, estas estarán ubicadas en /usr o /lib en el sistema host.

Como desarrollador, puede utilizar este resultado como línea de base. Ahora, puede realizar un seguimiento inverso del nombre de los paquetes que proporcionaron estas bibliotecas. Por ejemplo, en las distribuciones de Linux que utilizan paquetes deb y el dpkg herramienta de administración, puede usar la opción -S para rastrear los paquetes ascendentes.

ldd /bin/ls
linux-vdso.so.1 (0x00007ffff7bec000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007ffa556cb000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffa552da000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007ffa55068000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ffa54e64000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffa55b15000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ffa54c45000)
dpkg -S libdl.so.2
libc6:i386: /lib/i386-linux-gnu/libdl.so.2
libc6:amd64: /lib/x86_64-linux-gnu/libdl.so.2

De esta manera, puede crear una lista rudimentaria de paquetes de etapa para sus aplicaciones. Deberá enumerar los nombres de los paquetes que proporcionan las bibliotecas, excepto las bibliotecas que ya proporciona la base. Tenga en cuenta que deberá usar los nombres (y versiones) que coincidan con la base que especificó en su instantánea.Como un ejemplo crudo, en Ubuntu 18.04, tiene libncurses5, mientras que Ubuntu 21.04 ofrece libncurses6.

Si está utilizando un sistema que no es Ubuntu para el descubrimiento de paquetes, deberá «traducir» los nombres de los paquetes que informa su distribución (por ejemplo, Manjaro u openSUSE) y ver cómo se llaman dichos paquetes en Ubuntu. construya su propia base que no sea Ubuntu, pero esto está lejos de ser un ejercicio trivial.

El uso de ldd aunque no es completo. Si su aplicación utiliza el hundir() función, es posible que no necesariamente sepa lo que falta. En ese caso, deberá crear su instantánea, dejar que se ejecute y luego examinar el error de falla en tiempo de ejecución. Por lo general, verá qué bibliotecas no se pueden encontrar y luego deberá asignarse a nombres de paquetes y agregarse a la lista de paquetes de etapas.

/snap/kompozer/x1/usr/lib/kompozer/kompozer-bin: error while loading shared libraries: libmozjs.so: cannot open shared object file: No such file or directory

Para ayudarlo a crear sus instantáneas de manera más efectiva, Snapcraft intentará hacer una gran parte de la búsqueda y el descubrimiento por usted. El comportamiento exacto de la herramienta depende en cierta medida del núcleo que use, pero en esencia, Snapcraft intentará adivinar lo que necesita. El siguiente método debería ponerte en marcha:

  • Cree un complemento sin declarar ningún paquete de etapas. Vea si hay algún error de compilación o si Snapcraft ha resuelto las dependencias que faltan por usted.
  • Agregue cualquier paquete sugerido por Snapcraft.
  • Repita el proceso.

Por ejemplo:

This part is missing libraries that cannot be satisfied with any available stage-packages known to snapcraft:

- libIDL-2.so.0
- libpng12.so.0

These dependencies can be satisfied via additional parts or content sharing. Consider validating configured filesets if this dependency was built.

En el resultado de compilación anterior, el resultado de la línea de comandos del proceso de compilación de Snapcraft le dice explícitamente al usuario (desarrollador) que no pudo satisfacer dos dependencias, lo que significa que lo más probable es que no existan en los archivos de Ubuntu (para la base elegida). y tendrá que proporcionarlos usted mismo. A menudo, esto necesitará usar el vertedero complemento, y proporcionando bibliotecas adicionales o paquetes deb de sus propias fuentes locales o un repositorio en línea diferente.

Para hacer que su proceso de desarrollo sea aún más eficiente, también puede considerar usar el Paquete Snap Try y Snapcraft comandos, lo que le permite realizar cambios rápidamente en su proyecto de trabajo antes de ensamblarlo en un artefacto de complemento final. Esto puede ser muy útil, especialmente para descubrir las dependencias de tiempo de ejecución que faltan.

Con suerte, este artículo desmitifica algunas de las complejidades de la búsqueda y el descubrimiento de dependencias de Linux, y qué pasos deben seguir los desarrolladores para crear sus instantáneas de manera rápida y eficiente.Snapcraft intentará hacer muchas conjeturas inteligentes y resolver la lista de paquetes de etapa necesarios para usted, haciendo que la experiencia general sea más placentera. Si tiene alguna pregunta o sugerencia, únase a nuestro foro y háganoslo saber.

Foto por Ruthie sobre Unsplash.

LEER  Valve lanza Proton 7.0 con importantes mejoras para los juegos de Linux

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba