Grunt / NodeJs – 在Windows环境下调用ant命令作为产生进程

在一个Windows环境的咕噜生成过程中,我想调用两个ant命令作为产卵进程,以便能够跟踪输出。

它如下所示:

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(); } }); } }; 

团队城市使用这些任务的grunt build然后由命令行步骤触发。

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

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

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

使其跨平台。

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

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

简单地用一个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过程只需要less一个参数。