Cómo crear un archivo ejecutable (.exe) a partir de código JavaScript (usando Node.js)

Crear un ejecutable

Para esta demostración, vamos a utilizar pkg herramienta de línea de comandos. Usted es libre de elegir nexe u otro de su elección, pero me parece pkg más fácil de usar. En primer lugar, tenemos que instalar pkg globalmente utilizando el comando npm. También puedes instalarlo localmente para usar la interfaz CLI de forma programada.

$ npm install --global pkg
(fuente: gist.github.com)

Una vez que el paquete está instalado globalmente, tienes el comando pkg para crear ejecutables. El comando pkg necesita un archivo de entrada que es un programa JavaScript de entrada que se ejecutará cuando el usuario haga doble clic en el archivo ejecutable generado. Otras opciones de la línea de comandos controlan cómo se genera el archivo ejecutable.

Archivo de entrada

La ruta del archivo de entrada se proporciona a través del argumento <input> como el comando $ pkg server.js en nuestro caso que es una ruta de archivo local. Pero también podemos proporcionar la ruta a package.json y el comando pkg utilizará la propiedad bin del package.json para localizar la ruta del archivo JavaScript de entrada. Si se proporciona una ruta de directorio, entonces el comando pkg busca el archivo package.json de ese directorio utiliza su propiedad bin.

Assets

Assets son recursos estáticos como los archivos .html, .js, .css, .png, .json que deben ser incluidos en el ejecutable. Para indicar a pkg que incluya dichos archivos en el ejecutable, debemos proporcionar estas rutas de archivos a través de la propiedad pkg.assets del package.json. Su valor es un patrón glob o una matriz de patrones glob.

💡 En este caso, el package.json debe ser la ruta de entrada para que pkg pueda elegir assets que se necesitan para ser incluidos en el ejecutable.

Cuando se crea un ejecutable, pkg incluirá el archivo JavaScript de entrada junto con los activos estáticos en un solo archivo ejecutable. Aquí es donde las cosas se complican un poco. Dado que todos los archivos del proyecto están ahora empaquetados en un único archivo, las rutas relativas de los archivos pierden su significado y lo mismo ocurre con la estructura de carpetas.

Pero en tiempo de ejecución (cuando el ejecutable se está ejecutando), estos archivos se organizan en un sistema de archivos virtual llamado sistema de archivos de instantáneas. Normalmente, estos archivos en tiempo de ejecución tienen el prefijo /snapshot/ (o C:\snapshot\ en windows) en su ruta como si estuvieran ubicados dentro del directorio /snapshot del sistema.

Pero puede localizar con seguridad un archivo asset en el ejecutable (en tiempo de ejecución) utilizando el método path.join y la variable __dirname para construir una ruta relativa como path.join( __dirname, './www/main.js' ). La ruta funcionará como si tuviera una ruta de directorio real en un sistema de archivos real. Para saber más sobre el sistema de archivos snapshot, lee esta documentación.

💡 Cuidado. Durante el proceso de compilación, pkg mira las declaraciones require() en el código y automáticamente incluye estos archivos como activos estáticos. Por lo tanto, es posible que no necesite especificar dichos archivos como activos estáticos en el package.json. Sin embargo, hay algunas advertencias como se explica aquí.

Objetivos

Podemos generar un archivo ejecutable para un sistema específico utilizando la bandera de línea de comandos --targets. El valor de esta bandera una cadena en el formato <node>-<platform>-<arch>. También podría ser una lista separada por comas de este patrón para apuntar a múltiples arquitecturas de sistemas. También podría utilizar el campo pkg.targets del package.json para especificar estos valores.

El valor node es una versión principal objetivo del Nodo. El valor platform es el nombre del sistema operativo de destino y puede ser uno de estos freebsd, linux, alpine, macos, win. El valor arch es la arquitectura del procesador de destino y podría ser uno de estos x64, x86, armv6, armv7.

Podríamos omitir uno de estos valores de la especificación de destino. En ese caso, pkg utiliza su valor de la configuración actual del sistema. Podemos utilizar 'host' como valor para el --targets en cuyo caso todos estos valores se obtienen de la configuración actual del sistema.

Salida

Intentaremos crear archivos ejecutables para los sistemas operativos macOS y Windows, especialmente para la arquitectura del procesador x64. Como nuestro punto de entrada es server.js, utilizaremos la propiedad bin del package.json para indicar su ruta de archivo. Además, mencionaremos todas las rutas de archivos dentro de node_modules y src como activos estáticos ya que nuestro server.js depende de él. Teniendo en cuenta todos estos requisitos, nuestro package.json tiene el siguiente aspecto.

(fuente: gist.github.com)

Para generar los archivos binarios ejecutables, necesitamos ejecutar el comando pkg . ya que queremos que pkg utilice el archivo package.json del directorio actual para localizar el archivo de entrada, los activos y los objetivos. También podríamos utilizar el comando pkg package.json que también hace lo mismo.

Una vez ejecutado este comando, pkg descarga los binarios de Node.js apropiados en función de los valores de targets y los almacena en caché en un directorio especificado por la variable de entorno PKG_CACHE_PATH para que la próxima vez que se encuentren los mismos objetivos, pkg pueda utilizar los archivos binarios almacenados en caché.

Una vez descargados todos los archivos binarios, pkg genera los archivos ejecutables en el directorio actual. El nombre de archivo y la extensión de estos archivos es decidido por pkg y normalmente se parece a <package>-<target>.<ext> donde package es el valor name en el package.json.

Sin embargo, podemos controlar el esquema de nomenclatura y el directorio de salida utilizando los valores de opción --output o --out-path. Vamos a utilizar la bandera --output para especificar el directorio de salida y el nombre del archivo ejecutable.

$ pkg --output build/web .

El comando anterior genera los siguientes archivos dentro del directorio build.

node-js-executable
└── build
├── web-node10-win.exe (37.4mb)
└── web-node12-macos (43.4mb)

Ahora usted puede hacer doble clic en cualquiera de estos archivos (según su máquina) y se abrirá una página web en el navegador del sistema por defecto mostrando la fórmula uno drivers.

(http://127.0.0.1:52254/)

Deja una respuesta

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