2015-05-18 17 views
15

Ich möchte Webpack im --watch Modus ausführen und einen Shellbefehl nach jedem Build ausführen, der einen Ordner mit einem anderen synchronisiert.Befehl ausführen nach Webpack Build

Ich fand this plugin, die nach jedem Build ein Ereignis auslöst. Das funktioniert, aber der letzte Teil des Puzzles ist es, einen Shell-Befehl (zum Synchronisieren) aus Javascript auszulösen. Irgendwelche Hinweise darauf, wie dies zu erreichen ist, werden sehr geschätzt.

Antwort

2

Sie können problemlos alle Shell-Befehle mit dem eingebauten child_process-Modul ausführen. Sie können auch einige Shell-Bibliotheken für node.js ausprobieren, zB Shell.js. Es wickelt die meisten Standard-Shell für eine bequemere Nutzung

+0

Dank, das war das fehlende Glied. Ich bin irgendwie im Kreis gelaufen und habe diese Option komplett verpasst. – Monokai

45

Ich auch so etwas benötigt, so kompilierte ich ein super einfaches Plugin Shell Anweisungen vor und nach jedem Build auszuführen.

'use strict'; 

var exec = require('child_process').exec; 

function puts(error, stdout, stderr) { 
    console.log(stdout); 
} 

function WebpackShellPlugin(options) { 
    var defaultOptions = { 
    onBuildStart: [], 
    onBuildEnd: [] 
    }; 

    this.options = Object.assign(defaultOptions, options); 
} 

WebpackShellPlugin.prototype.apply = function(compiler) { 
    const options = this.options; 

    compiler.plugin("compilation", compilation => { 
    if(options.onBuildStart.length){ 
     console.log("Executing pre-build scripts"); 
     options.onBuildStart.forEach(script => exec(script, puts)); 
    } 
    }); 

    compiler.plugin("emit", (compilation, callback) => { 
    if(options.onBuildEnd.length){ 
     console.log("Executing post-build scripts"); 
     options.onBuildEnd.forEach(script => exec(script, puts)); 
    } 
    callback(); 
    }); 
}; 

module.exports = WebpackShellPlugin; 

dann in Ihrem webpack config:

plugins: [ 
    new WebpackShellPlugin({ 
     onBuildStart: ['echo "hello world"'], 
     onBuildEnd: ['echo "goodbye world"'] 
    }) 
] 

Das ist super einfach, und keine Unterstützung für Asynchron-Skripte richtig. Aber es funktioniert. Fühlen Sie sich frei zu ändern, wie Sie es für richtig halten.

Betrachten Sie diesen Code unter MIT-Lizenz.

Benötigt Knoten 4.x und bis zum Ausführen, wie ich einige es6 Funktionen hier verwenden.

+7

Wenn Sie auf die Bundle-Dateien zugreifen müssen, ist es besser, 'after-emit' zu verwenden, da' emit' ausgelöst wird, wenn Webpack die Dateien ausgibt. –

+0

können Sie eine nicht e6 Version erstellen? –

+1

dort gehen Sie: https://jsfiddle.net/0s4d4f8e/2/ –

Verwandte Themen