Al interactuar con clis, por ejemplo, tomando npm init
, podemos ejecutar el comando y obtener el resultado con el siguiente código
const { exec } = require('child_process'); exec('npm init', (err, stdout, stderr) => { if (err) { console.error(err) } else { console.log(`stdout: ${stdout}`); console.log(`stderr: ${stderr}`); } });
Pero no podemos pasar el nombre del proyecto, el nombre de la versión, etc. Cómo lograr esto. Por favor, responda con el ejemplo del comando npm init
Gracias por adelantado :)
Utilice el canal stdin que proporciona cada proceso. Para eso, use el método node child_process.spawn
en su lugar:
const { spawn } = require('child_process'); const npm = spawn('npm', ["init"]); npm.stdout.pipe(process.stdout); npm.stderr.pipe(process.stderr); npm.on("exit", () => { console.log("npm exited"); process.exit(); }); const answers = [ "my-awesome-cli", // package name "0.0.1", // version number "desciprtion", // description "index.js", // entry point "", // test command "", // git reposiroty "", // keywords "Marc Stirner", // author "MIT" // license ]; setInterval(() => { if (answers.length > 0) { // get first item from array let answer = answers.shift(); // print value we pass to npm console.log("Write to npm child:", answer); // write chunk to stdin npm.stdin.write(`${answer}\r\n`); } else { //npm.stdin.end(); console.log("Hit final enter") npm.stdin.write(`\r\n`); } }, 800);
Mi ejemplo genera el comando npm, usa el canal stdin para escribir la respuesta al proceso y canaliza la salida stdout&stderr del comando npm al proceso node.js.
También puede hacer esto con exec
, ya que también devuelve un objeto child_process
.
Lea más en los documentos de node.js, están muy bien documentados.