Node中exec函数执行cordova build命令时参数被忽略如何解决?
问题原因
Node的exec函数会先启动系统shell解析输入的命令字符串,多个连续的--符号会被shell做特殊截断处理,导致实际传递给cordova进程的参数丢失。你直接在cmd运行时没有额外的shell解析层,所以参数可以正常传递。
可行解决方案
方案1:使用execFile替代exec(最推荐)
execFile不会启动额外的shell解析命令,直接把参数以数组形式传递给目标进程,完全避免转义问题,代码示例:
const execFile = require('child_process').execFile; // 第一个参数为执行程序,后续参数按顺序放在数组中即可 execFile('cordova', [ 'build', 'android', '--release', '--', '--', '--packageType=bundle' ], function (error, stdout, stderr) { if(error){ return log(error.message) } callBack && callBack(stdout); return resolve(); })
方案2:使用spawn执行命令
如果需要实时获取命令输出流,可以用spawn,同样按数组传递参数规避转义问题:
const spawn = require('child_process').spawn; const buildProcess = spawn('cordova', [ 'build', 'android', '--release', '--', '--', '--packageType=bundle' ]); buildProcess.stdout.on('data', data => console.log(data.toString())); buildProcess.stderr.on('data', data => console.error(data.toString())); buildProcess.on('close', code => { if(code !== 0) return log(`构建失败,退出码:${code}`); callBack && callBack('构建完成'); resolve(); })
方案3:坚持用exec的转义处理
如果必须使用exec,可以把命令后段的特殊参数用双引号包裹,规避shell解析问题,Windows环境下示例:
const exec = require('child_process').exec; exec('cordova build android --release "-- -- --packageType=bundle"', function (error, stdout, stderr) { if(error){ return log(error.message) } callBack && callBack(stdout); return resolve(); })
内容的提问来源于stack exchange,提问作者José Salgado
相关产品推荐
相关产品推荐

