2015-04-23 18 views
5

Spero che qualcuno possa chiarire come il metodo spawnCommand() di Yeoman funzioni un po '. Sto lavorando su un generatore e mi piacerebbe inizializzare un repository git, commettere e spingere l'app generata alla fine.Push to git repo in un generatore di yeoman?

Avevo l'impressione che il secondo parametro fosse un array, è un array di comandi che verrebbero eseguiti durante il processo. Quindi, qualcosa di simile a ciò sarebbe 'git init' seguito da 'git aggiungere remota origine', ecc

end: function() { 
    if(this.repo !== '') { 
     this.spawnCommand('git', ['init', 
     'remote add origin ' + this.repo, 
     'add --all', 
     'commit -m "initial commit from generator"', 
     'push -u origin master'] 
    ); 
    } 
    console.log(yosay('I believe we\'re done here.')); 
} 

Purtroppo, è solo genera un errore utilizzo:

usage: git init [-q | --quiet] [--bare] ... 

Allora ho provato a fare init sul proprio seguito dagli altri in questo modo:

end: function() { 
    if(this.repo !== '') { 
     this.spawnCommand('git', ['init']); 
     this.spawnCommand('git', ['remote add origin ' + this.repo, 
     'add --all', 
     'commit -m "initial commit from generator"', 
     'push -u origin master'] 
    ); 
    } 
    console.log(yosay('I believe we\'re done here.')); 
} 

L'uscita poi fa un po 'meno senso per me:

git: 'remote add origin {URL}' is not a git command. See 'git --help'. 
Initialized empty Git repository in /my/project/.git/ 

Questo mi fa pensare che siano in esecuzione in modo asincrono, il che potrebbe essere il motivo per cui l'aggiunta dell'origine remota non riesce, ma altrimenti sono molto confuso.

C'è un altro modo per fare in modo che il generatore spinga, o sto meglio senza tentare di automatizzare la spinta iniziale?

EDIT:

esecuzione di ogni comando come propria spawnCommand() non funziona neanche.

this.spawnCommand('git', ['init']); 
this.spawnCommand('git', ['remote add origin ', this.repo]); 
this.spawnCommand('git', ['add --all']); 
this.spawnCommand('git', ['commit -m "initial commit from generator"']); 
this.spawnCommand('git', ['push -u origin master']); 

uscita:

error: invalid key: pager.remote add origin 
error: invalid key: pager.add --all 
error: invalid key: alias.remote add origin 
error: invalid key: alias.add --all 
error: invalid key: pager.commit -m "initial commit from generator" 
error: invalid key: pager.push -u origin master 
Initialized empty Git repository in /my/project/.git/ 
error: invalid key: alias.commit -m "initial commit from generator" 
error: invalid key: alias.push -u origin master 
git: 'remote add origin ' is not a git command. See 'git --help'. 
git: 'push -u origin master' is not a git command. See 'git --help'. 
git: 'add --all' is not a git command. See 'git --help'. 
git: 'commit -m "initial commit from generator"' is not a git command. See 'git --help'. 

Cominciando a pensare che questo potrebbe non essere il modo migliore per farlo.

risposta

7

Utilizzare uno this.spawnCommandSync() per comando git che si desidera eseguire.

this.spawnCommandSync('git', ['init']); 
this.spawnCommandSync('git', ['remote', 'add', 'origin', this.repo]); 
this.spawnCommandSync('git', ['add', '--all']); 
this.spawnCommandSync('git', ['commit', '-m', '"initial commit from generator"']); 
this.spawnCommandSync('git', ['push', '-u', 'origin', 'master']); 

La matrice è una matrice di argomenti stringa. Questa è la stessa interfaccia di node.js spawn - nessuna magia oltre al wrapping cross-spawn per il supporto di Windows.

this.spawnCommand() è asincrono, quindi se lo si utilizza, è necessario controllare il flusso in modo che i comandi non vengano eseguiti tutti contemporaneamente e nell'ordine errato. Considerando che questo è un generatore di yeoman, l'uso di un comando sincrono di solito è abbastanza buono.

+0

L'output da questo ha generato un sacco di errori. Anche i comandi sembravano esauriti? –

+0

Modificato la mia risposta con ulteriori dettagli. –

+0

Grazie per il chiarimento. Non riuscivo a far funzionare async.series, anche se sembra che sarebbe la soluzione più pulita. Ho finito per usare i callback in questo modo: this.spawnCommand ('git', ['command']). On ('close', function() {}); Non super pulito, ma dato il numero fisso di passaggi sembrava a posto. Grazie per l'aiuto! –