如何从Grunt任务运行grunt-init?

时间:2013-09-20 05:05:17

标签: gruntjs grunt-init

我要么消隐,要么本来应该更复杂。

我正在尝试从Grunt任务运行grunt-init,如下所示:

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 个答案:

答案 0 :(得分:3)

使用grunt.util.spawn创建子流程。您可以将其设置为异步并将stdio设置为“inherit”,以便可以回答任何模板提示。另外,你应该设置一个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();
    });
});

答案 1 :(得分:0)

我想我找到了办法,但对我来说感觉很糟糕。我会回答这个问题,但给你。

可以使用grunt-parallel

完成

咕噜平行

使用以下内容定义任务:

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