Création d’un exécutable
Pour cette démo, nous allons utiliser l’outil de ligne de commande pkg
. Vous êtes libre de choisir nexe
ou autre de votre choix mais je trouve pkg
plus facile à utiliser. Tout d’abord, nous devons installer pkg
globalement en utilisant la commande npm
. Vous pouvez également l’installer localement pour utiliser l’interface CLI de manière programmatique.
$ npm install --global pkg
Une fois que le paquet est installé globalement, vous obtenez la commande pkg
pour créer des exécutables. La commande pkg
a besoin d’un fichier d’entrée qui est un programme JavaScript d’entrée qui s’exécutera lorsque l’utilisateur double-cliquera sur le fichier exécutable généré. D’autres options de ligne de commande contrôlent la façon dont le fichier exécutable est généré.
Fichier d’entrée
Le chemin du fichier d’entrée est fourni par l’argument <input>
tel que la commande $ pkg server.js
dans notre cas qui est un chemin de fichier local. Mais on peut aussi fournir le chemin à package.json
et la commande pkg
utilisera la propriété bin
du package.json
pour localiser le chemin du fichier JavaScript d’entrée. Si un chemin de répertoire est fourni, alors la commande pkg
recherche le fichier package.json
de ce répertoire utilise sa propriété bin
.
Assets
Les assets sont des ressources statiques telles que les fichiers .html
, .js
, .css
, .png
, .json
qui doivent être inclus dans l’exécutable. Pour demander à pkg
d’inclure de tels fichiers dans l’exécutable, nous devons fournir ces chemins de fichiers à travers la propriété pkg.assets
du package.json
. Sa valeur est un motif glob ou un tableau de motifs glob.
💡 Dans ce cas, le
package.json
devrait être le chemin d’entrée afin quepkg
puisse choisirassets
qui sont nécessaires pour être inclus dans l’exécutable.
Lorsqu’un exécutable est créé, pkg
inclura le fichier JavaScript d’entrée avec les actifs statiques dans un seul fichier exécutable. C’est ici que les choses se compliquent un peu. Puisque tous les fichiers du projet sont maintenant emballés dans un seul fichier, les chemins de fichiers relatifs perdent leur sens et il en va de même pour la structure des dossiers.
Mais au moment de l’exécution (lorsque l’exécutable s’exécute), ces fichiers sont organisés dans un système de fichiers virtuel appelé système de fichiers instantané. Habituellement, ces fichiers au moment de l’exécution ont le préfixe /snapshot/
(ou C:\snapshot\
dans windows) dans leur chemin comme s’ils étaient situés à l’intérieur du répertoire /snapshot
du système.
Mais vous pouvez localiser en toute sécurité un fichier d’actifs dans l’exécutable (au moment de l’exécution) en utilisant la méthode path.join
et la variable __dirname
pour construire un chemin relatif tel que path.join( __dirname, './www/main.js' )
. Le chemin fonctionnera tout à fait comme si vous aviez un chemin de répertoire réel dans un système de fichiers réel. Pour en savoir plus sur le système de fichiers snapshot, lisez cette documentation.
💡 Attention. Pendant le processus de compilation,
pkg
regarde les déclarationsrequire()
dans le code et inclut automatiquement ces fichiers comme des actifs statiques. Par conséquent, vous pourriez ne pas avoir besoin de spécifier ces fichiers comme actifs statiques dans lepackage.json
. Cependant, il y a quelques avertissements comme expliqué ici.
Targets
Nous pouvons générer un fichier exécutable pour un système spécifique en utilisant le drapeau de ligne de commande --targets
. La valeur de ce drapeau une chaîne de caractères dans le format <node>-<platform>-<arch>
. Il pourrait également être une liste séparée par des virgules de ce motif pour cibler plusieurs architectures de système. Vous pourriez également utiliser le champ pkg.targets
du package.json
pour spécifier ces valeurs.
La valeur node
est une version majeure cible du nœud. La valeur platform
est le nom du système d’exploitation cible et il pourrait être l’un de ces freebsd, linux, alpine, macos, win
. La valeur arch
est l’architecture du processeur cible et elle pourrait être l’une de ces x64, x86, armv6, armv7
.
On pourrait omettre une de ces valeurs de la spécification cible. Dans ce cas, pkg
utilise sa valeur à partir de la configuration actuelle du système. Nous pouvons utiliser 'host'
comme valeur pour le --targets
, auquel cas toutes ces valeurs sont obtenues à partir de la configuration actuelle du système.
Sortie
Nous allons essayer de créer des fichiers exécutables pour les systèmes d’exploitation macOS et Windows, en particulier pour l’architecture du processeur x64
. Comme notre point d’entrée est server.js
, nous utiliserons la propriété bin
du package.json
pour indiquer son chemin de fichier. De même, nous mentionnerons tous les chemins de fichiers à l’intérieur de node_modules
et src
comme des actifs statiques puisque notre server.js
en dépend. En considérant toutes ces exigences, notre package.json
ressemble à ce qui suit.
Pour générer les fichiers exécutables binaires, nous devons exécuter la commande pkg .
puisque nous voulons que pkg
utilise le fichier package.json
du répertoire courant pour localiser le fichier d’entrée, les actifs et les cibles. Nous pourrions également utiliser la commande pkg package.json
qui fait également la même chose.
Une fois que cette commande est exécutée, pkg
télécharge les binaires Node.js appropriés en fonction des valeurs targets
et les met en cache dans un répertoire spécifié par la variable d’environnement PKG_CACHE_PATH
de sorte que la prochaine fois que les mêmes cibles seront rencontrées, pkg
pourrait utiliser les fichiers binaires mis en cache.
Une fois que tous les fichiers binaires sont téléchargés, pkg
génère les fichiers exécutables dans le répertoire actuel. Le nom de fichier et l’extension de ces fichiers sont décidés par pkg
et ressemblent normalement à <package>-<target>.<ext>
où package
est la valeur name
dans le package.json
.
Cependant, nous pouvons contrôler le schéma de nommage et le répertoire de sortie en utilisant les valeurs d’option --output
ou --out-path
. Nous allons utiliser l’indicateur --output
pour spécifier le répertoire de sortie et le nom du fichier exécutable.
$ pkg --output build/web .
La commande ci-dessus génère les fichiers suivants à l’intérieur du répertoire build
.
node-js-executable
└── build
├── web-node10-win.exe (37.4mb)
└── web-node12-macos (43.4mb)
Maintenant, vous pouvez double-cliquer sur l’un de ces fichiers (selon votre machine) et cela ouvrira une page web dans le navigateur système par défaut affichant les pilotes de la formule 1.
.