Как запустить grunt-init из задачи Grunt?
Я либо отключаюсь, либо сложнее, чем должно было быть.
Я пытаюсь бежать grunt-init
из задачи Grunt, что-то вроде этого:
grunt.registerTask('init', 'Scaffold various artifacts', function(param) {
// analyze `param` and pass execution to `grunt-init`
// run `grunt-init path/to/some/template/based/on/param/value`
});
Часть анализа param
это, конечно, не проблема. Это работает grunt-init
то есть.
Бег grunt-init
прямо в той же папке, что и приведенные ниже попытки работает нормально.
Я пробовал следующие методы (путь к шаблону указан для краткости кода), но все безрезультатно:
Грунт-оболочка
shell: {
init: {
options: {
stdout: true,
callback: function(err, stdout, stderr, cb) {
...
}
},
command: 'grunt-init path/to/some/template/based/on/param/value'
}
}
а потом:
grunt.registerTask('init', 'Scaffold various artifacts', function(param) {
grunt.task.run(['shell:init']);
});
и в командной строке:
grunt init
или из командной строки напрямую:
grunt shell:init
Грунт-Exec
exec: {
init: {
cmd: 'grunt-init path/to/some/template/based/on/param/value',
callback: function() {
...
}
}
}
а потом:
grunt.registerTask('init', 'Scaffold various artifacts', function(param) {
grunt.task.run(['exec:init']);
});
и в командной строке:
grunt init
или из командной строки напрямую:
grunt exec:init
узла exec
grunt.registerTask('init', 'Scaffold various artifacts', function(param) {
var exec = require('child_process').exec;
exec('grunt-init path/to/some/template/based/on/param/value', function(err, stdout, stderr) {
...
});
});
и в командной строке:
grunt init
Ничего такого.
Были различные попытки, лучшая из которых была бы печать первой строки grunt-init
незамедлительный:
Running "init" task
И это все.
Что мне не хватает? Должен ли я подключить stdout
каким - то образом?
2 ответа
Я думаю, что нашел способ, но это кажется мне хакерским. Я собираюсь ответить на это, но, пожалуйста, дай свой тоже.
Это можно сделать, используя параллельное соединение
Грунт-параллельный
где задача определяется с помощью:
parallel: {
init: {
options: {
stream: true
},
tasks: [
{cmd: 'grunt-init'}
]
}
}
а также init
Задача:
grunt.registerTask('init', 'Scaffold various artifacts', function(param) {
// calculate path based on `param`
...
grunt.config.set('parallel.init.tasks.0.args', ['path/to/some/template/based/on/param/value']);
grunt.task.run(['parallel:init']);
});
затем запустив в командной строке следующее:
grunt init:<some param indicating template type or similar>
правильно работает grunt-init
,
Создайте дочерний процесс с помощью grunt.util.spawn. Вы можете сделать его асинхронным и установить stdio в значение "наследовать", чтобы можно было отвечать на любые запросы шаблона. Кроме того, вы должны установить cwd, иначе он попытается перезаписать ваш существующий Gruntfile.js!
grunt.registerTask('init', 'Scaffold various artifacts', function(grunt_init_template) {
var done = this.async();
grunt.util.spawn({
cmd: 'grunt-init',
args: [grunt_init_template],
opts: {
stdio: 'inherit',
cwd: 'new_project_dir',
}
}, function (err, result, code) {
done();
});
});