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.

Zurück