在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
。
答案 0 :(得分:1)
Windows需要命令的文件扩展名,例如.cmd
,.exe
,.bat
附加到命令。我认为 ant会提供ant.cmd
,在这种情况下你会这样做:
var antCmd = process.platform === 'win32' ? 'ant.cmd' : 'ant';
使其跨平台。
答案 1 :(得分:1)
我使用以下grunt脚本来执行shell命令并启动一个ant进程。
答案 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进程少参数。