Intento ejecutar un comando usando un proceso secundario y no puedo ejecutarlo por ruta absoluta usando nodejs, pero cuando uso la terminal, todo está bien.
¿Porqué es eso?
Mi código está aquí:
const cp = require('child_process'); const commandExecutor = 'node-install/target/node/yarn/dist/bin/yarn.exe'; const symlinkFolder = 'node-install/target/node/target/symlink'; const workingDirectories = []; Array.from(process.argv).forEach((value, index) => { if (index >= 2) { workingDirectories[index - 2] = value; } }); workingDirectories.forEach(function(workingDirectory) { const argumentsUnlink = 'unlink @item@ --link-folder ' + symlinkFolder + ' --cwd ' + workingDirectory; const unlinkCommand = commandExecutor + ' ' + argumentsUnlink; const execution = cp.exec( unlinkCommand, function (error, stdout, stderr) { console.log(stdout); console.log(error); console.log(stderr); }); execution.on('exit', function (code) { let message = 'Child process exited with exit code ' + code + ' on route ' + workingDirectory; console.log(message); }); });Un ejemplo de comando es:
node-install/target/node/yarn/dist/bin/yarn.exe unlink @item@ --link-folder node-install/target/node/target/symlink --cwd appointments/target/generated-sources/frontend/
Pero el error que tengo es:
'node-install' is not recognized as an internal or external command, operable program or batch file. Mientras ejecuto el comando desde la terminal, todo está bien.
Uno de los posibles problemas: NodeJs no puede ubicar el archivo por ruta relativa. Puede usar la ruta absoluta de construcción para solucionar esto, algunas opciones para ayudar si la instalación del nodo se encuentra en la raíz de su proyecto (no en la lista definitiva):
__dirname , que devuelve el directorio del módulo actual, por lo que si node-install/../.. index.js entonces en index.js podemos usar
const commandExecutor = `${__dirname}/node-install/target/node/yarn/dist/bin/yarn.exe`;process.cwd() , que devuelve la ruta completa de la raíz del proceso, por lo que si inicia nodejs desde la carpeta que tiene node-install , puede consultar el exe de esta manera: const commandExecutor = `${process.cwd()}/node-install/target/node/yarn/dist/bin/yarn.exe`;