Ich habe ein Node/angular) - Projekt, das npm für das Backend-Abhängigkeitsmanagement und bower für das Frontend-Abhängigkeitsmanagement verwendet. Ich würde gerne eine Grunt-Task verwenden, um beide Installationsbefehle auszuführen in der Lage, herauszufinden, wie es geht.
Ich habe versucht, exec
zu verwenden, aber es wird nichts installiert.
module.exports = function(grunt) {
grunt.registerTask('install', 'install the backend and frontend dependencies', function() {
// adapted from http://www.dzone.com/snippets/execute-unix-command-nodejs
var exec = require('child_process').exec,
sys = require('sys');
function puts(error, stdout, stderr) { console.log(stdout); sys.puts(stdout) }
// assuming this command is run from the root of the repo
exec('bower install', {cwd: './frontend'}, puts);
});
};
Wenn ich cd
in das Frontend öffne node
und diesen Code über die Konsole ausführe, funktioniert dies einwandfrei. Was mache ich falsch in der Grunzaufgabe?
(Ich habe auch versucht, die Bower- und Npm-APIs zu verwenden, aber auch das hat nicht funktioniert.)
Sie müssen grunt mitteilen, dass Sie eine asynchrone Methode (.exec
) Verwenden, indem Sie die this.async()
-Methode aufrufen, einen Rückruf erhalten und diese aufrufen, wenn exec abgeschlossen ist.
Das sollte funktionieren:
module.exports = function(grunt) {
grunt.registerTask('install', 'install the backend and frontend dependencies', function() {
var exec = require('child_process').exec;
var cb = this.async();
exec('bower install', {cwd: './frontend'}, function(err, stdout, stderr) {
console.log(stdout);
cb();
});
});
};
Siehe Warum wird meine asynchrone Aufgabe nicht abgeschlossen?
So installieren Sie clientseitige Komponenten während npm install
gleichzeitig mit serverseitigen Bibliotheken können Sie in Ihrem package.json
"dependencies": {
...
"bower" : ""
},
"scripts": {
...
"postinstall" : "bower install"
}
Ich ziehe es vor, den Unterschied zwischen Installieren und Testen/Erstellen zu machen
Zu Ihrer Information, hier bin ich jetzt.
Sie hätten das Problem auch auf andere Weise lösen können, d. H. Npm die Ausführung von bower und grunt schließlich npm. Siehe Benutze Laube mit Herok .
grunt.registerTask('install', 'install the backend and frontend dependencies', function() {
var async = require('async');
var exec = require('child_process').exec;
var done = this.async();
var runCmd = function(item, callback) {
process.stdout.write('running "' + item + '"...\n');
var cmd = exec(item);
cmd.stdout.on('data', function (data) {
grunt.log.writeln(data);
});
cmd.stderr.on('data', function (data) {
grunt.log.errorlns(data);
});
cmd.on('exit', function (code) {
if (code !== 0) throw new Error(item + ' failed');
grunt.log.writeln('done\n');
callback();
});
};
async.series({
npm: function(callback){
runCmd('npm install', callback);
},
bower: function(callback){
runCmd('bower install', callback);
}
},
function(err, results) {
if (err) done(false);
done();
});
});
Grunt-Aufgabe, die genau diese Aufgabe erfüllt (gemäß der obigen Lösung von Sindre):
Grunt-Task, die den Bower-Installationsbefehl ausführt: https://github.com/yatskevich/grunt-bower-task
sie können auch https://github.com/stephenplusplus/grunt-bower-install verwenden
um Ihre Abhängigkeiten automatisch in die Datei index.html einzufügen