2017-03-03 8 views
0

ich einige git Befehle nacheinander ausführen bin, insbesondere ich nach einem GIT Strömungsmodell,node.js - Ausgang aus exec nach kontinuierlichen Befehlen

z.B. wenn ein Feature Finishing, ich laufe,

git pull 
git push -u origin branchname 
git pull origin develop 
git checkout develop 
git merge branchname 
git push 

ich diese Befehle mit dem exec Modul in node.js laufen und ich ketten sie einer nach dem anderen, wie:

exec(command1, 
    (err, stdout, stderr) => { 
      if(err != null) { 
        //display an error message 
        return 
      } else { 
        exec(command2, (err, stdout, stderr) =>{ ... } 
      } 

     } 
) 

Und so weiter. Die Ausgänge funktionieren ordnungsgemäß und die Bestellung funktioniert. Wenn jedoch einer dieser Befehle fehlschlägt, breche ich aus der Kette aus.

Ich weiß, dass es eine Async-Bibliothek gibt, die ich mit dem gleichen Effekt verwenden konnte, per here. Ist dies jedoch der beste Weg, dies zu tun, ohne auf eine Bibliothek von Drittanbietern zurückgreifen zu müssen? Wie haben es andere Leute gemacht?

+0

denke ich, was Sie suchen eigentlich für ein Shell-Skript, kein Knotenmodul. – Bergi

+0

Verwenden Sie einfach 'if (! Err)'? – Bergi

+0

@Bergi Ich benutze 'if (! Err)' und entwickle auch auf Electron. – akcorp2003

Antwort

1

Ist dies jedoch der beste Weg, dies zu tun, ohne auf eine Bibliothek von Drittanbietern zurückgreifen zu müssen?

Nr

Wie haben andere Leute es getan?

Es gibt drei Arten von anderen Lösungen:

  • nur diese Bibliothek verwenden. Benutzt wird sein gesamter Zweck.
  • erfinden Sie diese Bibliothek neu. Denn dann ist es kein Drittanbieter mehr, egal welche Vorteile es hat.
  • Versprechungen nutzen! (Und teilweise Anwendung)

    function makeExec(command) { 
        return function(/* ignore results */) { 
         return new Promise(function(resolve, reject) { 
          child_process.exec(command, function(err, stdout, stderr) { 
           if (err != null) reject(Object.assign(err, {stderr})); 
           else resolve(stdout); 
          }); 
         }); 
        }); 
    } 
    Promise.resolve() 
    .then(makeExec("git pull")) 
    .then(makeExec("git push -u origin branchname")) 
    .then(makeExec("git pull origin develop")) 
    .then(makeExec("git checkout develop")) 
    .then(makeExec("git merge branchname")) 
    .then(makeExec("git push")) 
    .catch(function(err) { 
        //display an error message 
    }) 
    
+0

Ich werde versuchen, die Route der Stackoverflow-Antwort zu gehen, die ich in meiner Frage verlinkt habe. Danke für die Rückmeldung! – akcorp2003

1

async Verwenden Sie können dies tun, mit eachSeries:

var commands = [ 
    'git pull', 
    'git checkout', 
    '...' 
]; 

eachSeries(commands, (command, cb) => { 
    exec(command, (err, stdout, stderr) => { 
    cb(err); 
    }); 
}); 

Es ist generell besser, eine Bibliothek zu finden, der dies tut, als zu haben, um Ihre eigene Lösung mit der Hand hadern.

Verwandte Themen