web-dev-qa-db-fra.com

Comment faire des fichiers exe à partir d'une application node.js?

J'ai une application de noeud que j'ai écrite et que je lance comme suit:

node.exe app.js inputArg

Existe-t-il un moyen de regrouper cela dans un fichier .exe seul? Donc je peux juste faire quelque chose comme ça?

App.exe inputArg

J'ai un moyen de simuler cela en utilisant un fichier batch, donc je peux le faire:

App.bat inputArg

Mais cela nécessite que j'ai toutes les dépendances et le noeud dans ce dossier, ce qui n'est pas idéal.

113
Aishwar

Il existe quelques alternatives, gratuites et commerciales. Je n'en ai utilisé aucun, mais en théorie, ils devraient fonctionner:

Dans la plupart des cas, vous devrez conserver le fichier de commandes en tant qu'exécutable principal, puis regrouper node.exe et vos scripts.

En fonction de votre script, vous avez également la possibilité de le porter sur JSDB , qui prend en charge un moyen simple de créer des exécutables simplement y ajouter des ressources.

Une troisième quasi-solution est de garder le noeud quelque part comme C:\utils et ajoutez ce dossier à votre variable d’environnement PATH. Ensuite, vous pouvez créer des fichiers .bat dans ce répertoire qui exécutent nœud + vos scripts préférés - le coffee de coffeescript fonctionne de cette façon sur les fenêtres. Cette configuration peut être automatisée avec un fichier de commandes, un script vb ou un programme d'installation.

30
Ricardo Tomasi

La solution que j'ai utilisée est celle de Roger Wang node-webkit .

C'est un moyen fantastique de conditionner et de distribuer les applications nodejs. Cela vous donne même la possibilité de "regrouper" l'ensemble de l'application en un seul exécutable. Il supporte Windows, Mac et Linux.

Ici quelques documents sur les différentes options de déploiement des applications node-webkit, mais en un mot, vous procédez comme suit:

  1. Zip tous vos fichiers, avec un package.json à la racine
  2. Changer l'extension de .Zip à .nw
  3. copier/b nw.exe + app.nw app.exe

En guise de remarque supplémentaire, j’ai expédié plusieurs applications de production cd/install de production en utilisant cela, et cela a très bien fonctionné. Même application fonctionne sur Windows, Mac, Linux et sur le Web.

47
Clayton Gulick

Pour ceux qui tombent sur cette question, il y a maintenant deux projets qui créent des exes à partir de vos projets de nœud, Pkg et Electron.atom.io , ils diffèrent légèrement:

  1. Pkg compilera votre projet en code natif, il comprendra également des actifs ET une installation de nodejs (le système n'aura pas besoin d'installer nodejs pour exécuter le fichier .exe. ). Votre code source ne sera pas inclus. L'exécutable résultant est Windows UNIQUEMENT (.exe). Toutes les plates-formes sont prises en charge maintenant. Il nécessite maintenant une licence pour les produits commerciaux. Entièrement open source.
  2. Electron.atom.io s’il ne compacte pas et ne génère pas d’exe .exe, il peut être utilisé pour distribuer des applications nodejs car elles offrent un moyen de distribuer des applications . Les avantages sont qu’électron est multi-plateforme (windows, mac osx, linux), les inconvénients sont que votre code source sera inclus, même s'ils offrent un moyen de distribuer votre application à l’intérieur d’un asar archive . Ce ne sera pas à l'épreuve des balles mais c'est quand même mieux que votre source en clair.
26
sokie

Par défaut, Windows associe .js fichiers avec le Windows Script Host , le moteur d’exécution JS autonome de Microsoft. Si vous tapez script.js à une invite de commande (ou double-cliquez sur un .js dans l’explorateur), le script est exécuté par wscript.exe.

Cela peut être résoudre un problème local avec un paramètre global , mais vous pourriez associer.js fichiers avec node.exe à la place, de sorte que taper script.js à l’invite de commande ou double-cliquer/glisser les éléments sur les scripts les lancera avec Node.

Bien sûr, si, comme moi, vous avez associé .js fichiers avec un éditeur de sorte qu'un double-clic ouvre votre éditeur de texte préféré, cette suggestion ne fera pas beaucoup de bien. Vous pourriez aussi ajouter une entrée de menu contextuel de "Exécuter avec un noeud" à .js fichiers, bien que cette alternative ne résolve pas vos besoins en ligne de commande.


La solution la plus simple consiste probablement à utiliser simplement un fichier de commandes. Vous n'avez pas besoin de posséder une copie de Node dans le dossier dans lequel votre script se trouve. Référencez simplement le Node exécutable absolument:

"C:\Program Files (x86)\nodejs\node.exe" app.js %*

Une autre alternative est cette application C # très simple qui démarrera Node en utilisant son propre nom de fichier + .js en tant que script à exécuter et transmettez tous les arguments de la ligne de commande.

class Program
{
    static void Main(string[] args)
    {
        var info = System.Diagnostics.Process.GetCurrentProcess();
        var proc = new System.Diagnostics.ProcessStartInfo(@"C:\Program Files (x86)\nodejs\node.exe", "\"" + info.ProcessName + ".js\" " + String.Join(" ", args));
        proc.UseShellExecute = false;
        System.Diagnostics.Process.Start(proc);
    }
}

Donc, si vous nommez le fichier EXE résultant "app.exe", vous pouvez taper app arg1 ... et Node sera lancé avec la ligne de commande "app.js" arg1 .... Notez que l'application d'amorçage C # se fermera immédiatement, laissant Node en charge de la fenêtre de la console).

Étant donné que cela présente probablement un intérêt relativement large, je me suis lancé dans la direction de disponible sur GitHub , y compris le compilé exe si vous préférez vous rendre dans des vans avec des inconnus.

22
josh3736

Le meilleur outil que je connaisse est l'outil NodeJS: zeit/pkg

Il est très facile à utiliser (beaucoup plus que Nexe, juste à titre d'exemple), vous pouvez simplement l'installer globalement: npm install -g pkg

pour créer des exécutables pour macOS, Linux et Windows:

pkg exampleApp.js

J'avais un peu de code compliqué qui utilisait le serveur de socket NodeJS, j'ai essayé différentes applications, aucune d'entre elles ne l'a créé correctement, à l'exception de zeit/pkg .

14
user8376713

Je n'ai pas essayé, mais nexe semble pas pouvoir faire cela:

https://github.com/crcn/nexe

12
B T

Depuis que cette question a été résolue, une autre solution a été lancée.

https://github.com/appjs/appjs

Au moment de la rédaction de cet article, il s’agissait de la solution ultime pour le packaging des applications node.js via un package chromé épuré compilé dans un exécutable.

Edit: AppJS n’est plus actif, mais suggère lui-même un fork appelé Deskshell.

https://github.com/sihorton/appjs-deskshell/

12
bitfed

Il y a beaucoup de bonnes réponses ici, mais elles ne sont pas toutes aussi simples que JXcore .

Une fois que JXcore est installé sur Windows, tout ce que vous avez à faire est d’exécuter:

jx package app.js "myAppName" -native

Cela produira un fichier .exe que vous pouvez distribuer et qui peut être exécuté sans aucune dépendance externe (vous n'avez même pas besoin de JXcore ni de Node.js sur le système).

Voici la documentation sur cette fonctionnalité: http://jxcore.com/packaging-code-protection/#cat-74

Éditer 2018

Ce projet est maintenant mort mais il est toujours hébergé ici: https://github.com/jxcore/jxcore-release (merci @Elmue)

11
Nepoxx

Essayez disclose: https://github.com/pmq20/disclose

disclose crée essentiellement un fichier exe auto-extractible à partir de votre projet Node.js et de son interpréteur Node.js avec les caractéristiques suivantes,

  1. Pas d'interface graphique. Pure CLI.
  2. Aucune dépendance à l'exécution
  3. Prend en charge Windows et Unix
  4. Fonctionne lentement pour la première fois (extraction dans un répertoire de cache), puis rapide pour toujours

Essayez node-compiler: https://github.com/pmq20/node-compiler

J'ai fait un nouveau projet appelé node-compiler pour compiler votre projet Node.js en un seul exécutable.

C'est mieux que disclose en ce sens qu'il ne s'exécute jamais lentement pour la première fois, car votre code source est compilé avec l'interpréteur Node.js, tout comme les bibliothèques standard Node.js.

De plus, il redirige les demandes de fichiers et de répertoires de manière transparente vers la mémoire plutôt que vers le système de fichiers au moment de l'exécution. Ainsi, aucun code source n'est requis pour exécuter le produit compilé.

Comment ça marche: https://speakerdeck.com/pmq20/node-dot-js-compiler-compiler-votre-node-dot-js-application-into-a-single-executable

En comparant avec des projets similaires,

  • pkg ( https://github.com/zeit/pkg ): Pkg a piraté fs. * L'API est dynamique pour accéder aux fichiers du paquet, alors que Node.js Compiler les laisse seuls et fonctionne à la place un niveau plus profond via libsquash. Pkg utilise JSON pour stocker les fichiers contenus dans le paquet, tandis que Node.js Compiler utilise SquashFS, plus sophistiqué et largement utilisé, comme structure de données.

  • EncloseJS ( http://enclosejs.com/ ): EncloseJS limite l'accès aux fichiers contenus dans le package à seulement cinq API fs. *, Alors que Node.js Compiler prend en charge toutes les API fs. *. EncloseJS est une licence propriétaire et facture de l'argent lorsqu'il est utilisé, tandis que Node.js Compiler est sous licence MIT et les utilisateurs sont libres de l'utiliser et de le modifier.

  • Nexe ( https://github.com/nexe/nexe ): Nexe ne prend pas en charge les requêtes dynamiques en raison de son utilisation de browserify, alors que Node.js Compiler prend en charge tous les types de requêtes, y compris require.resolve.

  • asar ( https://github.com/electron/asar ): Asar utilise JSON pour stocker les informations sur les fichiers, tandis que Node.js Compiler utilise SquashFS. Asar conserve l'archive de code et l'exécutable séparément tandis que Node.js Compiler lie tout le code source JavaScript à la machine virtuelle Node.js et génère un seul exécutable en tant que produit final.

  • AppImage ( http://appimage.org/ ): AppImage ne prend en charge que Linux avec un noyau prenant en charge SquashFS, tandis que Node.js Compiler prend en charge les trois plates-formes de Linux, macOS et Windows, sans aucune modification particulière. fonctionnalités requises du noyau.

6
Minqi Pan

Je vous recommande BoxedApp pour cela. C'est un produit commercial qui fonctionne très bien. Cela fonctionne pour n'importe quelle application NodeJS. L'utilisateur final obtiendra un seul fichier EXE pour votre application. Pas besoin d'installation.

Dans Electron, par exemple, l'utilisateur final doit installer/décompresser votre application et il verra tous les fichiers source de votre code.

BoxedApp Il regroupe tous les fichiers et dépendances nécessaires à votre application NodeJS. Il supporte les compressions et le fichier compilé fonctionne sous Windows XP +

Lorsque vous l'utilisez, veillez à ajouter Node.EXE à l'application compilée. Choisissez une version de noeud compatible Windows XP (si vous en avez besoin)

Le programme supporte les arguments en ligne de commande, donc après package, vous pouvez le faire

c:\myApp argument1

Et vous pouvez obtenir l'argument dans votre code de noeud:

process.argv[1]

Parfois, votre application a des dépendances de fichiers. Ainsi, dans BoxedApp, vous pouvez ajouter n'importe quel dossier et fichier en tant que dépendance. Vous pouvez par exemple insérer un fichier de paramètres.

var mySettings=require('fs').readFileSync('./settings.jgon').toString()

Plus d'infos:

Juste une note: généralement, je recommande l'utilisation de logiciels libres/open-source, mais dans ce cas, je n'ai rien trouvé qui puisse faire le travail.

4

J'ai trouvé que l'une de ces solutions répondait à mes exigences, c'est pourquoi j'ai créé ma propre version du noeud appelé node2exe. Il est disponible à partir de https://github.com/areve/node2exe

3
areve

J'ai exploré ce sujet pendant quelques jours et voici ce que j'ai trouvé. Les options se répartissent en deux catégories:

Si vous souhaitez créer une application de bureau, les meilleures options sont:

1- NW.js : permet d’appeler tous les modules Node.js directement à partir de DOM et offre une nouvelle façon d’écrire des applications avec toutes les technologies Web.

2- Electron : Construire des applications de bureau multiplateformes avec JavaScript, HTML et CSS

Voici une bonne comparaison entre eux: NW.js & Electron Compared . Je pense que NW.js est meilleur et il fournit également une application pour compiler des fichiers JS. Il existe également des générateurs autonomes d’exécutables et d’installateurs tels que Enigma Virtual Box . Ils contiennent tous deux une version intégrée de Chrome, ce qui est inutile pour les applications serveur.

Si vous souhaitez créer un package pour une application serveur, voici les meilleures options:

node-compiler : Compilateur AOT (Ahead-of-time) conçu pour Node.js, qui fonctionne simplement.

Nexe : créez un seul exécutable à partir de vos applications node.js

Dans cette catégorie, je pense que le compilateur de nœuds est préférable car il prend en charge les modules de nœuds dynamiques requis et natifs. Il est très facile à utiliser et la sortie commence à 25 Mo. Vous pouvez lire une comparaison complète avec d'autres solutions dans Node Compilateur. Je n'ai pas beaucoup lu sur Nexe, mais pour l'instant, il semble que Node Le compilateur ne ne compilez pas le fichier js au format binaire à l'aide de la fonctionnalité d'instantané V8, mais il est prévu pour la version 2. Il comportera également un générateur d'installation intégré.

2
Ali

Essayez le lien qui crée un seul exécutable à partir de vos applications node.js

https://github.com/nexe/nexe

2
Dhrubo

J'en avais marre de commencer à gagner à partir de la commande Invite, puis je me suis heurté à cela également. Légèrement amélioré ver. sur quoi josh3736 . Cela utilise un fichier XML pour saisir quelques paramètres. Par exemple, le chemin d'accès à Node.exe ainsi que le fichier à démarrer dans le fichier par défaut app.js. Également l'environnement à charger (production, dev, etc.) que vous avez spécifié dans votre app.js (ou server.js ou ce que vous avez appelé). Essentiellement, il ajoute le NODE_ENV={0} où {0} est le nom de votre configuration dans app.js en tant que var pour vous. Vous faites cela en modifiant l'élément "mode" dans le fichier config.xml. Vous pouvez récupérer le projet ici ==> github . Remarque dans les événements post-construction, vous pouvez modifier les chemins de copie pour copier automatiquement votre fichier config.xml et l'exécutable dans votre répertoire Nodejs, juste pour enregistrer une étape. Sinon, éditez-les ou votre version générera un avertissement.

var startInfo = new ProcessStartInfo();
        startInfo.FileName = nodepath;
        startInfo.Arguments = apppath;
        startInfo.UseShellExecute = false;
        startInfo.CreateNoWindow = false;
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;

        if(env.Length > 0)
            startInfo.EnvironmentVariables.Add("NODE_ENV", env);

        try
        {
            using (Process p = Process.Start(startInfo))
            {
                p.WaitForExit();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString(), "Start Error", MessageBoxButtons.OK);
        }
1
origin1tech

Il y a peut-être beaucoup d'autres options, mais à ma connaissance, un projet est en développement actif sur GitHub https://github.com/zeit/pkg . Tu peux jouer avec. Un de plus sur https://github.com/nexe/nexe mais pas en développement actif.

1
Rohit Luthra

Il existe un projet d’outil de construction opensource appelé nodebob . Je suppose que les fenêtres de la plateforme de travail,

  1. simplement cloner ou télécharger le projet
  2. copiez tous vos fichiers de projet node-webkit dans le dossier de l'application.
  3. exécutez le script build.bat.

Vous trouverez le fichier exécutable dans le dossier de publication.

0
cagcak