Как запустить 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();
    });
});
Другие вопросы по тегам