在线编译系统之nodejs执行shell
最近公司做个简单的小工具,是一个简单的在线编译系统。现在做几点简单的总结记录。
1、路径的问题。
node程序执行的路径,可能会影响程序中的相对路径使用。(这点有待进一步研究,分析理论)因此就用到了path模块。之前也没觉得这个模块有多重要,这次才发现它的方便。下面几个是我用到的。
以下只是自己的简单理解,可能并不表达的那么准确,具体请参考nodejs的官网api。(建议看英文版的,中文版还是稍微有些不全的)
path.resolve(from, to) : from是一个绝对路径,to是一个相对路径,最终to的绝对路径。注意,to若是一个目录,则这个路径得到的是一个目录的路径,但这个路径最后没有“/”。若是文件,则是文件的绝对路径。
path.relative(from,to): from和to都是绝对路径,得到from相对于to的相对路径。
path.basename(p,[ext]): 得到路径最后的文件名,包括后缀名。如果加了ext参数项,则只返回文件的名字,不包括后缀名。
path.extname(p):得到文件的后缀名,包括“.”。
path.dirname(p):得到路径的目录名.不包括最后的“/”。
path.join(args1, arg2....): 将各个参数合并为一个路径,并且规范化。
2、nodejs执行shell
在这个编译系统中,很多东西都是用shell完成的。shell确实很重要,也需要花点时间去补充理论知识。
在nodejs中执行shell,使用child_process.有三种方法,spawn,exec和execFile。spawn没怎么使用,所以我就没发言权,说下exec和execFile。前者建议使用于语句量小的,当然也可以执行多个语句,每个命令字符串用分割符连接。如果语句量多,还是建议使用文件。
在执行shell,很重要的一点就是路径问题。因为shell中使用的相对路径相会失效。因为执行一个shell,会新建一个子进程,主进程的proces.env会传递到子线程。需要在主进程进入子进程前使用process.chmdir(),切换到shell的执行目录下。nodejs的api也非常周到,其中有个opts的参数,可以设置opts.cwd。来改变shell的执行环境。
3、简单的shell编程
自己没有shell的编程经验,所以无权说什么。有一点就是参数的传递,$1就是第一个参数,等等。
4、async
async模块一个非常重要。因为代码中设计很多异步函数,这样代码结构就非常乱。async的使用,可以是程序显得更简洁易看。
async.series({ one :func1(cb){}, two.func2(cb){} ..... function(err, ){ }); });
只要有一个函数有错误就返回。最终会把每个的cb组成一个对象的元素。也可以定为数组。
更多需要进一步学习。
5、关于编程
刚开始定任务自己就闷头干,代码写的很乱。而且中间需求变更带来的痛苦.....后来稍微用面向对象的重构了一下。所以,以后尽量要建立面向对象编程的思维,更立体,也更有利于维护。