AppImageBuilder: el fin del infierno de las dependencias en Linux

Tabla de Contenidos

¡Muy buenas tardes a todos y bienvenidos a otro vídeo por el canal! Hoy vamos a tratar el que sea probablemente uno de los problemas técnicos más frustrantes cuando pasamos de ser simples usuarios de Linux a querer compartir el software que hemos creado: el problema de las dependencias.

El problema: "en mi PC funciona"

Todos hemos pasado por ahí. Te pasas horas programando una herramienta, la compilas, la testeas en tu distro (en mi caso sabéis que es Arch), verificas que todo funciona y luego se la pasas a un compañero que puede utilizar Linux Mint, Ubuntu o cualquier otra distribución. Y lo primero que recibe es un error como:

libcrypto.so not found

O cualquier .so que es una librería no encontrada, o que su versión de glibc es demasiado antigua. Es algo muy frustrante que te quita las ganas de desarrollar software para distintas distribuciones y al final acabas pensando: ¿para qué voy a hacer software de escritorio si puedo hacer una webapp que funciona para todos?

Pues vamos a ver cómo romper con ese problema. Lo que vamos a hacer es empaquetar software en Linux de una forma que funcione en cualquier distribución. Y no estoy hablando ni de Flatpak ni de snaps, sino de lo que se conocen como las AppImages.

¿Qué es una AppImage?

Una AppImage no es un zip con todos los archivos y ya está. Es una imagen de disco comprimida que al ejecutarse se monta mediante FUSE (Filesystem in User Space).

Lo puedes entender como que llevas un mini disco duro con tu aplicación y todas las librerías, y el sistema simplemente lo pincha temporalmente para poder leerlo. Esto significa que:

  • No toca las carpetas del sistema
  • No necesita sudo para ejecutarse
  • Es agnóstica a la distribución de Linux

Si tienes el motor de FUSE instalado, que viene en casi todas las distribuciones, la aplicación va a ejecutarse sin problema.

Vamos a crear un ejecutable único y portable que contenga todo lo necesario para correr sin instalación, y lo vamos a hacer de forma profesional utilizando AppImageBuilder.

AppImageBuilder vs AppImageTool

Existen distintas formas de crear AppImages. Tienes AppImageTool, pero es una herramienta bastante manual y no resulta especialmente cómoda. Para este caso vamos a utilizar AppImageBuilder, que es una herramienta más moderna que utiliza lo que denominaremos como recetas en YAML y es capaz de resolver dependencias de una forma muy eficiente.

Instalación de AppImageBuilder

Para Arch o CachyOS está en el AUR, así que con yay o paru:

yay -S appimage-builder
# o
paru -S appimage-builder

Para otras distribuciones podéis ir al GitHub de appimage-builder y bajaros la propia AppImage del programa. Sí, resulta un poco irónico: estás utilizando una AppImage para crear otras AppImages.

Paso 1: obtener el binario de tu aplicación

Para este vídeo voy a utilizar como ejemplo Taskie, un gestor de tareas que he estado desarrollando en Flutter. Pero ojo, el concepto fundamental es el mismo para cualquier aplicación: C++, Python, Go o lo que sea.

En Flutter la compilación para Linux es:

flutter build linux --release

Esto nos genera el ejecutable dentro de build/linux/x64/release/bundle/. Si entráis ahí veréis el ejecutable de Taskie y un montón de archivos .so que son las librerías. Si coges el ejecutable solo y te lo llevas a otro PC, no va a funcionar porque no va a encontrar esas librerías. Y aquí es precisamente donde AppImageBuilder entra en juego.

Paso 2: generar la receta con el asistente

En una carpeta limpia lanzamos el generador interactivo:

appimage-builder --generate

Esto inicia un asistente que nos va a preguntar:

  • ID de la aplicación: algo como com.rengtech.taskie
  • Nombre: Taskie
  • Icono: el path al .png o .svg que queréis usar como icono
  • Ejecutable: el path al binario compilado
  • Arquitectura: x86_64 para un PC de 64 bits estándar

Al terminar nos habrá creado un archivo AppImageBuilder.yml.

Paso 3: entender y configurar el YAML

Abrid el fichero generado y fijaos en la sección AppDir. Aquí le decimos a la herramienta qué incluir.

Lo clave de AppImageBuilder es que usa los repositorios de Ubuntu o Arch para descargar las librerías que falten y meterlas dentro de la imagen. Si vuestra aplicación necesita, por ejemplo, libssl para encriptación de certificados SSL, la herramienta la va a buscar, descargar y empaquetar por vosotros. Sin que tengáis que ir buscándola de forma manual.

Paso 4: compilar la AppImage

Con el fichero ya configurado, llega el momento de la verdad. Un detalle importante: este proceso gestiona paquetes y sistemas de archivos temporales, así que lo mejor es lanzarlo con privilegios para que pueda descargar cualquier tipo de paquetes del sistema:

sudo appimage-builder --recipe AppImageBuilder.yml

El terminal empezará a trabajar: creará el AppDir, configurará el AppRun (el script que lanza todo), resolverá los enlaces simbólicos de las librerías y finalmente comprimirá todo en el .AppImage.

Si veis un mensaje que dice success, ya lo tenéis: ha funcionado correctamente y vais a ver el ejecutable de vuestra aplicación completamente portable.

Paso 5: permisos de ejecución

Mucha gente descarga una AppImage, hace doble clic y no ocurre nada. Hay que tener en cuenta que Linux por seguridad no marca como ejecutable un archivo descargado por defecto.

Podéis darle permiso desde la interfaz gráfica: botón derecho → Propiedades → Permisos → Permitir ejecutar como programa. O desde el terminal:

chmod +x vuestra-app.AppImage
./vuestra-app.AppImage

Y ahora sí: ejecutáis la AppImage y veis que arranca con sus iconos, sus fuentes y sus dependencias completamente aisladas. Lo mejor es que si ahora os lleváis ese archivo a un Debian, a un Fedora o a cualquier otra distro, va a funcionar exactamente igual que en vuestra máquina.

Funcionalidades avanzadas

Actualizaciones automáticas

Podéis configurar el update information en la receta YAML para que la AppImage sepa a dónde buscar las nuevas versiones, ya sea en GitHub, GitLab o cualquier repositorio que utilicéis para distribuir vuestros ficheros.

Integración en el escritorio con AppImageLauncher

Para que las AppImages se integren de forma nativa en el sistema existe AppImageLauncher. Con esta herramienta el sistema detecta la AppImage y la integra en el menú de aplicaciones como si fuese un .deb, un .rpm o cualquier aplicación nativa.

Conclusión

Algo que era un problema frustrante del pasado, que era compartir aplicaciones en Linux, ahora con herramientas como AppImageBuilder nos permite centrarnos en simplemente escribir el código. Toda la parte de empaquetado y distribución es algo mucho más sencillo. Deja de hacer webapps solo por miedo a las dependencias y vuelve al software nativo.

¡Espero que os sea útil! Si os ha gustado el contenido y queréis más vídeos técnicos sobre Linux y desarrollo, dejad vuestros comentarios. ¡Hasta luego!

¿Te gusta este contenido?

Si este artículo te fue útil, considera invitarme un café. ¡Tu apoyo ayuda a mantener este sitio!

Artículos Relacionados