Est-il possible d'exécuter deux tâches de surveillance simultanément?
Je comprends que je peux avoir le nombre de tâches que je veux à l’intérieur de regarder les paramètres et simplement lancer grunt watch et il les regardera toutes, comme ceci
...
watch: {
A: {
files: "js/dev/**/*.coffee",
tasks: ["coffee", "requirejs"]
},
B: {
files: "js/dev/**/*.coffee",
tasks: ["coffee"]
},
C: {
files: "js/dev/**/*.html",
tasks: ["copy"]
}
}
...
... mais je n'ai pas besoin de ça. Je veux juste avoir différentes tâches pour le développement et la production. Comme vous pouvez le deviner, la seule différence entreA(production) etB(développement) est la minification et la concaténation. Je n'ai pas besoin de lancerAetBtâches en même temps.
D'abord je suis venu avec cette idée
grunt.registerTask("prod", ["watch:A", "watch:C"]);
grunt.registerTask("dev", ["watch:B", "watch:C"]);
Mais cela n'a pas fonctionné. Les premières tâches de surveillance fonctionnent (Cne fonctionne jamais). Est-ce possible de faire ce que je veux?
J'ai trouvé en utilisant grunt-concurrent works:
concurrent: {
options: {
logConcurrentOutput: true
},
prod: {
tasks: ["watch:A", "watch:C"]
},
dev: {
tasks: ["watch:B", "watch:C"]
}
}
Ensuite:
grunt.registerTask("prod", ["concurrent:prod"]);
grunt.registerTask("dev", ["concurrent:dev"]);
EDIT: concurrent a maintenant une option logConcurrentOutput
! Plus d'infos ici: https://github.com/sindresorhus/grunt-concurrent#logconcurrentoutput .
Watch est une tâche étrangement concurrente mais bloquante. Vous devez donc faire preuve de créativité pour que les fonctionnalités multitâches fonctionnent.
Concurrent perd toutes les sorties des tâches de surveillance, ce qui n'est pas idéal.
Essayez d’écrire dynamiquement l’objet config dans une tâche personnalisée:
grunt.registerTask('watch:test', function() {
// Configuration for watch:test tasks.
var config = {
options: {
interrupt: true
},
unit: {
files: [
'test/unit/**/*.spec.coffee'
],
tasks: ['karma:unit']
},
integration: {
files: [
'test/integration/**/*.rb',
'.tmp/scripts/**/*.js'
],
tasks: ['exec:rspec']
}
};
grunt.config('watch', config);
grunt.task.run('watch');
});
La meilleure et la seule solution qui fonctionne est la suivante: https://npmjs.org/package/grunt-focus Ajoutez ce plugin puis:
focus: {
sources: {
include: ['js', 'html', 'css', 'grunt']
},
testu: {
include: ['js', 'html', 'css', 'testu', 'grunt']
},
testi: {
include: ['js', 'html', 'css', 'testu', 'testi', 'grunt']
}
},
watch: {
js: {
files: paths.js,
tasks: ['jshint'],
options: {
livereload: true
}
},
html: {
files: paths.html,
options: {
livereload: true
}
},
css: {
files: paths.css,
tasks: ['csslint'],
options: {
livereload: true
}
},
testu: {
files: ['test/**/*.js', 'test/**/*.css'],
tasks: ['mochaTest'],
options: {}
},
testi: {
files: ['test/**/*.js', 'test/**/*.css'],
tasks: ['exec:cleanTestDB', 'protractor_webdriver', 'protractor'],
options: {}
},
grunt: {
files: ['Gruntfile.js', 'server/config/env/*.js'],
options: {
reload: true
}
}
}
Ensuite, vous utilisez focus: sources ou focus: testu à votre convenance.
JM.
grunt-concurrent ou Grunt-focus sont deux bonnes solutions, mais elles cassent toutes les fonctionnalités livereload
.
Ma solution à cela est de composer la configuration de la montre de manière dynamique, en supposant que vous n'exécuterez pas les deux configurations en même temps.
Vous pouvez faire quelque chose comme ça
grunt.config.merge({
watch: {
options: {
livereload: true
},
C: {
files: "js/dev/**/*.html",
tasks: ["copy"]
}
}
});
grunt.registerTask('watch-forProd', function () {
grunt.config.merge({
watch: {
A: {
files: "js/dev/**/*.coffee",
tasks: ["coffee", "requirejs"]
}
}
});
grunt.task.run('watch');
});
grunt.registerTask('watch-forDev', function () {
grunt.config.merge({
watch: {
B: {
files: "js/dev/**/*.coffee",
tasks: ["coffee"]
}
}
});
grunt.task.run('watch');
});
grunt.registerTask("prod", ["watch-forProd"]);
grunt.registerTask("dev", ["watch-forDev"]);
Sans se soucier de grunt.registerTask () dans Gruntfile.js, je lance parfois grunt en tant que processus en arrière-plan dans la ligne de commande:
$ grunt watch:A &
$ grunt watch:C &
Vous pouvez créer les commandes sous forme de script batch pour plus de commodité. J'espère que ça aide.
SEPTEMBRE 2018
Vous n'avez plus besoin d'utiliser grunt-simultané. Grunt a maintenant ceci intégré, voici un exemple de l'un de mes projets en cours ...
module.exports = function(grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
sass: {
theme: {
files: {
'../../web/sites/all/themes/ifafri/css/generated/theme_ifafri_master.css' : '../../web/sites/all/themes/ifafri/css/master.scss'
}
},
bootstrap: {
files: {
'../../web/sites/all/themes/ifafri/css/generated/theme_ifafri_bootstrap.css' : '../../web/sites/all/themes/ifafri/css/bootstrap/master.scss'
}
}
},
watch: {
theme: {
files: '../../web/sites/all/themes/ifafri/css/*.scss',
tasks: ['sass:theme'],
options: {
spawn: false,
livereload: true,
nospawn: false
}
},
bootstrap: {
files: '../../web/sites/all/themes/ifafri/css/bootstrap/*.scss',
tasks: ['sass:bootstrap'],
options: {
spawn: false,
livereload: true,
nospawn: false
}
}
}
});
grunt.loadNpmTasks('grunt-contrib-sass');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-livereload');
grunt.registerTask('default',['watch']);
}
Je sais que cela ne répond pas directement à la question, mais ma solution consiste maintenant à utiliser Gulp au lieu de Grunt . Avec Gulp, vous codez et non pas à configurer. Vous êtes donc plus libre de faire ce que vous voulez.
JM.