Je suis en train de porter une bibliothèque CLI de Ruby vers Node.js. Dans mon code, j'exécute plusieurs binaires tiers lorsque cela est nécessaire. Je ne sais pas comment accomplir cela au mieux dans Node.
Voici un exemple dans Ruby où j'appelle PrinceXML pour convertir un fichier en PDF:
cmd = system("prince -v builds/pdf/book.html -o builds/pdf/book.pdf")
Quel est le code équivalent dans Node?
javascript
ruby
node.js
command-line-interface
Dave Thompson
la source
la source
Réponses:
Pour une version encore plus récente de Node.js (v8.1.4), les événements et les appels sont similaires ou identiques aux versions antérieures, mais il est encouragé d'utiliser les fonctionnalités de langage plus récentes standard. Exemples:
Pour une sortie mise en mémoire tampon et non formatée (vous obtenez tout cela en même temps), utilisez
child_process.exec
:Vous pouvez également l'utiliser avec Promises:
Si vous souhaitez recevoir les données progressivement en morceaux (sortie sous forme de flux), utilisez
child_process.spawn
:Ces deux fonctions ont une contrepartie synchrone. Un exemple pour
child_process.execSync
:Ainsi que
child_process.spawnSync
:Remarque: Le code suivant est toujours fonctionnel, mais s'adresse principalement aux utilisateurs d'ES5 et versions antérieures.
Le module de génération de processus enfants avec Node.js est bien documenté dans la documentation (v5.0.0). Pour exécuter une commande et récupérer sa sortie complète sous forme de tampon, utilisez
child_process.exec
:Si vous devez utiliser la gestion des E / S de processus avec des flux, par exemple lorsque vous attendez de grandes quantités de sortie, utilisez
child_process.spawn
:Si vous exécutez un fichier plutôt qu'une commande, vous voudrez peut-être utiliser des
child_process.execFile
paramètres qui sont presque identiques àspawn
, mais qui ont un quatrième paramètre de rappel commeexec
pour récupérer les tampons de sortie. Cela pourrait ressembler un peu à ceci:Depuis la v0.11.12 , Node prend désormais en charge les modes synchrone
spawn
etexec
. Toutes les méthodes décrites ci-dessus sont asynchrones et ont une contrepartie synchrone. La documentation pour eux peut être trouvée ici . Bien qu'elles soient utiles pour les scripts, notez que contrairement aux méthodes utilisées pour générer des processus enfants de manière asynchrone, les méthodes synchrones ne renvoient pas d'instance deChildProcess
.la source
child.pipe(dest)
(qui n'existe pas), vous devez utiliserchild.stdout.pipe(dest)
etchild.stderr.pipe(dest)
, par exemplechild.stdout.pipe(process.stdout)
etchild.stderr.pipe(process.stderr)
.echo "hello"
etecho "world"
.Noeud JS
v13.9.0
, LTSv12.16.1
etv10.19.0
--- mars 2020Méthode Async (Unix):
Méthode asynchrone (Windows):
Sync:
De documentation Node.js v13.9.0
Il en va de même pour la documentation Node.js v12.16.1 et la documentation Node.js v10.19.0
la source
'cmd', ['/c', 'dir']
. Au moins, je cherchais juste haut et bas pourquoi'dir'
sans arguments ne fonctionne pas avant de m'en souvenir ...;)Vous recherchez child_process.exec
Voici l'exemple:
la source
data
événements sur stdout. Regardez dans les documents, mais ça doit être quelque chose comme çachildProc.stdout.on("data", fn)
.la source
Depuis la version 4, l'alternative la plus proche est la
child_process.execSync
méthode:Notez que l'
execSync
appel bloque la boucle d'événements.la source
child_process
être est créé lors de l'utilisationexecSync
? Et est-il supprimé juste après la commande, non? Donc pas de fuite de mémoire?Si vous voulez quelque chose qui ressemble étroitement à la première réponse mais qui est également synchrone, cela fonctionnera.
la source
Je viens d'écrire un assistant Cli pour gérer facilement Unix / windows.
Javascript:
Fichier source original dactylographié:
la source
Si cela ne vous dérange pas une dépendance et que vous souhaitez utiliser des promesses,
child-process-promise
fonctionne:installation
Utilisation d'Exec
utilisation du frai
la source
Vous pouvez maintenant utiliser shelljs (à partir du nœud v4) comme suit:
la source
Utilisez ce
npm
package léger :system-commands
Regardez-le ici .
Importez-le comme ceci:
Exécutez des commandes comme celle-ci:
la source
La réponse de @ hexacyanide est presque complète. Sur commande Windows
prince
pourrait êtreprince.exe
,prince.cmd
,prince.bat
ou tout simplementprince
(je ne suis pas au courant de la façon dont les pierres précieuses sont empaquetés, mais les bacs MNP sont livrés avec un script sh et un script de traitement par lots -npm
etnpm.cmd
). Si vous voulez écrire un script portable qui s'exécuterait sur Unix et Windows, vous devez générer le bon exécutable.Voici une fonction d'apparition simple mais portable:
la source