Habitualmente la distribución de las aplicaciones creadas con Node se realiza enviando el código fuente y los archivos de configuración. Obligando al receptor a instalar las dependencias para ejecutar el programa. Un método que tiene varias ventajas, como la de poder instalar el programa en diferentes sistemas. Aunque también tiene desventajas, como la de no poder proteger el código desarrollado. Por eso, en ciertas ocasiones, puede ser beneficioso empaquetar aplicaciones de Node como un binario independiente. Lo que se puede conseguir gracias a pkg.
¿Por qué empaquetar las aplicaciones de Node?
Si la forma habitual de distribuir los programas Node en forma de código fuente nos podemos preguntar ¿qué ventajas tiene crear un binario? Las ventajas son múltiples. Una de las más obvias es la posibilidad de proteger el código fuente y cualquier credencial, pero también se simplifica el uso de los programas.
Al empaquetar las aplicaciones de Node como un binario con pkg se incluye no solo nuestro código, sino que también las dependencias y el runtime. Evitando de este modo problemas de compatibilidad por el hecho de que se intente ejecutar el programa sobre una versión diferente de Node. Evitando de este modo algunos de los problemas típicos en los procesos de instalación.
Empaquetar una aplicación básica de Node con pkg
Para crear una aplicación con pkg lo primero que vamos a necesitar es instalar el paquete. Al ser un programa que se usará en múltiples proyectos lo ideal es instalarlo de forma global, para lo que se puede usar la siguiente línea
npm install -g pkg
Siendo necesario en macOS y Linux incluir el comando sudo previamente.
Creación de un proyecto básico
Ahora solamente es necesario crear un programa básico con el que trabajar, para lo podemos recurrir otra vez a la línea de comandos.
mkdir test
cd test
npm init -y
Una vez hecho esto podemos crear un simple archivo index.js
en el que incluiremos un mensaje. Por ejemplo,
console.log('Binario creado con pkg');
Pudiendo comprobar que funciona correctamente escribiendo en la terminal el siguiente comando
node index
Compilación del proyecto
Antes de compilar el proyecto es necesario indicar mediante la opción bin
en el archivo package.json
cuál es el punto de inicio del programa. Una opción que se puede situar después de main
en la apuntaremos al archivo creado anteriormente. Una vez hecho esto se puede usar el comando pkg
para crear los paquetes, escribiendo para ello la siguiente línea en la terminal.
pkg .
Lo que creará tres versiones del programa, una para Windows, otra para macOS y otra para linux. Siendo el nombre de los archivos el del paquete seguido de un guión medio y el nombre de la plataforma. Lo que se producirá independientemente del sistema operativo sobre el que estemos trabajando. Así, para ejecutar la versión de macOS solamente deberemos escribir en la terminal
./test-macos
Además, estos archivos ofrecen la ventaja de no requerir la instalación de ningún otro programa en el ordenador de destino. Ni siquiera es necesario que se instala Node, ya que la versión correcta se incluye dentro del ejecutable.
Cambiar el nombre del programa y compilar para un único sistema
Posiblemente en la mayoría de los casos no nos interese tener las tres versiones del programa y el nombre no sea el adecuado. Algo que es posible solucionar mediante el uso de algunas opciones. Por ejemplo, la opción -t
permite seleccionar la plataforma sobre la que se compila el proyecto y -o
permite dar un nombre al archivo de salida. Así para crear un compilar con node14 para macOS sobre procesadores Intel de nombre sample
se puede escribir en la terminal
pkg -t node14-macos-x64 -o sample .
Lo que nos evita crear las versiones que no vamos a necesitar.
Conclusiones
En esta ocasión hemos podido ver cómo empaquetar aplicaciones de Node como un binario independiente gracias a pkg. Una solución con la que podemos evitar algunos de los problemas que pueden aparecer al distribuir aplicaciones desarrolladas sobre Node. Debido a que de esta forma estaremos seguros de que se usará la versión adecuada de Node.
Imagen de freestocks-photos en Pixabay