Ordern überwachen und bei Veränderung einen Befehl ausführen

von CodeKanal @codekanal

Es gibt vielfältige Situationen, wo es eine Hilfe ist, ein kleines Skript zu haben, dass einen Ordern (und Unterordner) auf Veränderungen überwacht und bei einer Änderung einen vorher festgelegten Befehl ausführt.

Hier ist so ein Skript: Passen Sie die Variablen folderToWatch und commandToRun an Ihre Bedingungen an.

/**
 * small helper script to watch a folder / directory for changes and then run a command
 *
 * 
 **/

const fs = require('fs')
const spawn = require('child_process').spawn

const folderToWatch = 'docs/'
const commandToRun = {
    executable: 'php',
    args: [
        'bin/console',
        'cache:clear'
    ]
}

let isRunning = false;

function runCommand() {
    return new Promise((resolve) => {
        isRunning = true;
        console.log("› running command");
        let cmd = spawn(commandToRun.executable, commandToRun.args);
        cmd.stdout.on('data', (data) => {
            process.stdout.write(data.toString());
        })
        cmd.stderr.on('data', (data) => {
            process.stdout.write(data.toString());
        })
        cmd.on('exit', () => {
            console.log("› done");
            isRunning = false;
            resolve();
        })
    });

}

console.log("› watching file changes in 'docs/'");

fs.watch(folderToWatch, {recursive: true}, (eventType, filename) => {
    if (!isRunning) {
        runCommand();
    }
})

Es gibt viele Tools die diese Funktion bereitstellen: Grunt ist wohl der Klassiker. Mit diesem Skript kommen Sie ganz ohne zusätzliche Software und Module aus (neben einer normalen NodeJs Installation).

Dieses Skript protokolliert, ob der aktuelle Befehl noch ausgeführt wird und führt solange keinen weiteren aus.