Comment créer un fichier exécutable (.exe) à partir de code JavaScript (en utilisant Node.js)

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
(source : gist.github.com)

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 que pkg puisse choisir assets 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éclarations require() 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 le package.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.

(source : gist.github.com)

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>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.

(http://127.0.0.1:52254/)

.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.