Command-Line-Tool mit node.js schreiben
In diesem Artikel zeige ich wie man node.js-scripts für die Kommandozeile schreibt. Dazu benötigen wir ein Unix basiertes System (Linux oder Mac) und eine node.js Installation.
Datei anlegen
Wichtig: Die Datei muss ausführende Rechte besitzen!
# Im Terminal ausführen:
touch cli-tool.js & chmod +x cli-tool.js
Als erstes fügen wir folgenden Zeile hinzu: #!/usr/bin/env node. Damit sagen wir, dass unser Script mit node.js ausgeführt werden soll.
#!/usr/bin/env node
Parameter auslesen.
Damit wir übergebene Parameter/Argumente auslesen können müssen wir eine entsprechende Funktion schreiben. Mal angenommen wir haben zwei Parameter --host und --port z.B ./cli-tool.js --host localhost --port 8000
/**
* process.argv.slice(2) => [ '--host', 'localhost', '--port', '3000' ]
*/
var args = process.argv.slice(2);
/**
* hier definieren wir unsere Standardwerte wenn jemand keine Parameter übergibt.
*/
var options = {
"host": "localhost",
"port": "3000"
}
/**
* wir übertragen unseren "args Array" in unser "options Objekt".
*/
function createOptions()
{
var rgx = /(^--)/;
for( var i = 0; i < args.length; i++ )
{
if( args[i].match(rgx) )
{
options[args[i].slice(2)] = args[i + 1] || "<no-value>";
}
}
};
Startpunkt definieren.
Jetzt brauchen wir noch ein Startpunkt. Dafür definieren wir eine init Funktion. Dort werden unsere Funktionen aufgerufen.
child_process Modul einbinden
Mit dem child_process Modul können wir eigene Prozesse erstellen und steuern. Damit haben wir Zugriff auf Terminal Kommandos wie ls, mkdir, ps -ax usw.
child_process einbinden
var exec = require('child_process').exec;
var spawn = require('child_process').spawn;
exec vs spawn
child_process hat zwei Funktionen spawn und exec. Der unterschied zwischen den beiden:
spawn
spawn übertragt die Daten durch ein stream und ist gut geeeignet wenn viele Daten übertragen werden.
exec
exec besitzte ein maxBuffer und kann nur eine betstimmte Datenmenge übertragen ( default: 200KB )
Hierbei handelt es sich um einen sehr groben unterschied. Wer mehr erfahren möchte, dem empfehle ich folgenden Artikel (auf englisch): Difference between spawn and exec of Node.js child_process
spawn und exec Beispiel
/**
* starte einen laufenden mongodb prozess mit spwan
*/
function startMongodb()
{
spawn('mongod', [ '--port', '27017' ], { stdio: 'inherit' }); //starte ein mongodb process
// spawn( Befehl, [ parameter1, parameter2, ...], { options } )
// mit stdio inherhit sorgen wir für einen output in der konsole
}
/**
* Beispiel mit exec
*/
function showMongoProcess()
{
//alle mongo prozesse ausgeben
exec('ps -ax | grep mongo', function(err, stdout, stderr){
if(err) throw err;
console.log(stdout); // in der konsole ausgeben.
});
}
Mit ./cli-tool.js
können wir unser Script ausführen.