开始以为挺简单的但是碰到了点麻烦,主要还是js本身异步执行任务不容易保证任务顺序的问题,主要难点是promise的使用。代码如下,存在些问题,项目目录下不能有子文件夹,脚本必须放在项目文件夹下。
我主要说一下我碰到的难点,
promise怎么用?
promise构造的时候构造函数是一个带resolve和reject两个参数的函数,在你的函数中调用能够切换promise对象的状态。
编译的时候必须先生成.o才能链接,因此使用promise.all()等待传入的promise对象全都切换到resolve状态才能进行链接。
所以在编译执行shell命令的时候,需要设定好回调函数,等到任务完成之后,resolve()这样就能保证一定的任务顺序
var process=require('child_process');//进程模块,提供调用shell脚本的能力
var fs=require('fs');//文件模块
var path=require('path');//路径模块
var dirname=__dirname;
var targetfile=[];
var files=[];
fs.readdir(__dirname,function(err,files){
for(var i=0;i<files.length;i++){
var result=files[i].match("((.cpp)|(.c))$");
if(result!=null){
targetfile.push(files[i].substring(0,result.index));
}
}
//生成汇编命令
var cmds=[];
var promises=[]
for(var i=0;i<targetfile.length;i++){
cmds.push("g++ -c "+targetfile[i]+".cpp");
}
for(var i=0;i<cmds.length;i++){
promises.push(new Promise(function(resolve,reject){
process.exec(cmds[i],function(error,stdout,stderr){
if(error){
reject();
}else{
resolve();
}
})
}));
}
Promise.all(promises).then(()=>{
var cmd="g++ "
for(var i=0;i<targetfile.length;i++)
cmd=cmd+targetfile[i]+".o ";
cmd=cmd+"-o main"
process.exec(cmd,function(error,stdout,stderr){
console.log("compile finish");
})
});
});