Grunt / NodeJs - 在Windows环境中调用ant命令作为生成进程

时间:2013-12-16 16:25:02

标签: node.js ant gruntjs spawn

在Windows环境中的grunt构建过程中,我想将两个ant命令称为spawn进程,以便能够跟踪输出。

如下所示:

    grunt.registerTask('app-clean', 'Cleaning tasks', function() {
        var done = this.async();

        if (context.device.platform === 'android' || context.device.platform === 'all') {
            spawnProcess('ant', ['clean'], {
                cwd: path.resolve(context.android)
            }, done);
        }
    });

    grunt.registerTask('app-build', 'Building tasks', function() {
        var done = this.async();

        if (context.device.platform === 'android' || context.device.platform === 'all') {
            spawnProcess('ant', ['release'], {
                cwd: path.resolve(context.android)
            }, done);
        }
    });

    // Helper function to execute and log out child process
    // TODO: implement a better success/error callback
    var spawnProcess = function(command, args, options, callback) {
        var process = spawn(command, args, options),
            err = false;

        process.stdout.on('data', function(data) {
            grunt.log.write(data);
        });

        process.stderr.on('data', function(data) {
            err = true;
            grunt.log.errorlns(data);
        });

        if (typeof callback === 'function') {
            process.on('exit', function() {
                if (!err) {
                    return callback();
                }
            });
        }
    };

然后使用 Team City 中的命令行步骤触发使用这些任务的grunt build

两个命令都返回Fatal error: spawn ENOENT

3 个答案:

答案 0 :(得分:1)

Windows需要命令的文件扩展名,例如.cmd.exe.bat附加到命令。我认为 ant会提供ant.cmd,在这种情况下你会这样做:

var antCmd = process.platform === 'win32' ? 'ant.cmd' : 'ant';

使其跨平台。

答案 1 :(得分:1)

我使用以下grunt脚本来执行shell命令并启动一个ant进程。

https://github.com/sindresorhus/grunt-shell

答案 2 :(得分:0)

只需用exec替换spawn进程就可以修复它,但其他两个答案也可以。

var execProcess = function(command, options, callback) {
        var process = exec(command, options),
            err = false;

        process.stdout.on('data', function(data) {
            grunt.log.write(data);
        });

        process.stderr.on('data', function(data) {
            err = true;
            grunt.log.errorlns(data);
        });

        if (typeof callback === 'function') {
            process.on('exit', function() {
                if (!err) {
                    return callback();
                }
            });
        }
};

execProcess('ant release', { cwd: path.resolve(context.android) }, done);

请注意,exec进程少参数。