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
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 quepkg
pueda elegirassets
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 declaracionesrequire()
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 elpackage.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.
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.