Abbiamo un Gruntfile.js
piuttosto complesso che esegue numerose operazioni per elaborare una serie di EPUB. Fa parte del nostro processo CI che viene eseguito regolarmente su Jenkins. A volte vogliamo avvisare la persona che ha avviato la compilazione di cose che si sono verificate - non errori ma piuttosto avvertimenti (l'attività può continuare ma è successo qualcosa di anormale). Usiamo Slack per la comunicazione. Che cos'è un meccanismo scalabile e gestibile per raggiungere questo obiettivo?
Al momento inseriamo una notifica da then()
per attività basate su promesse, elaborando ciò che è stato passato in then()
. A volte abbiamo moduli esterni noi require
per non gonfiare ulteriormente il Gruntfile. Alcune delle attività non sono basate su promesse. Vogliamo gestire tutti questi in modo standard.
Abbiamo pensato di utilizzare eventing, ma poi dovremmo iniettare una dipendenza nel modulo esterno. C'è un modo per gestire senza iniettarne uno?
processThings = require('./scripts/process-things'),
grunt.initConfig({
slack: {
options: {
username: 'Jenkins',
},
text: '{{message}}', // taken from grunt.option
}});
grunt.registerTask('validateSVGs', function () {
var svgFiles = glob.sync("./**/*.svg");
Promise.all(svgFiles.map(file => {
// perform validation here
})).then(values => {
// compile a message for Slack:
let errors = values.filter(el => { return el.err !== null; });
let message = ':rotating_light: SVG files had errors:\n${errors.join('\n')}';
grunt.option('message', message);
grunt.task.run('slack');
});
});
grunt.registerTask('downloadThings', function () {
processThings.then((results) => {
// push warnings from processThings to Slack - here or earlier, directly inside it
});
});
Opzioni che posso vedere adesso:
- Iniettare una dipendenza in moduli esterni per gestire le comunicazioni (Slack o un bus di qualche tipo).
- Continua a gestire tutto in
then()
per le attività basate su promesse e "promuovi" tutte quelle non basate su promesse. - Usa gli eventi, anche se non ho idea di come farlo nel contesto di NodeJS senza DOM (suppongo che potremmo usare grunt.event ).