Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

node命令行程序开发记录 #1

Open
junfeisu opened this issue Aug 16, 2018 · 1 comment
Open

node命令行程序开发记录 #1

junfeisu opened this issue Aug 16, 2018 · 1 comment
Labels
Node nodejs

Comments

@junfeisu
Copy link
Owner

No description provided.

@junfeisu junfeisu added the Node nodejs label Aug 16, 2018
@junfeisu
Copy link
Owner Author

junfeisu commented Aug 16, 2018

Node命令行程序

Node命令行程序就是通过Node.js编写的在命令行里执行的程序,常见的Node命令行程序就是脚手架程序.例如:vue-cli, angular-cli.当然还有其他类型的,就不一一列举了.

准备工作

首先,我们要给我们开发的程序一个具体的定位,也就是说程序的主题功能是什么.我的这个程序不限功能,当然目前支持的功能有两个:下载文件和vue-cli的简化版功能.

其次,选择解析命令行命令以及选项的库,不落俗套的选择了Tj大神的Commander.js,选择Commander.js原因:

  • 文档清晰明了(英文版的)
  • 产出的代码简洁易懂,初次阅读该库产出的代码也能大致理解(最关键).

当然写出一些简单的程序对大多数人来说相信都比较简单.程序写完了我怎么挂载这个命令这个才是大部分人关心的.就像vue-cli 安装之后就可以在命令行看到vue命令.

这个时候就需要npm link.在项目的package.json里面添加参数bin,bin参数就是用来指定内部命令对应的可执行文件的位置.然后就会在npm install的时候在node_modules/.bin/目录下创建一个链接,然后在该项目的npm script里就可以直接使用这个命令.如mocha,istanbul等.package.json参数

  "test": "mocha"

npm link的作用就是在全局的node目录下创建链接,链接到当前项目所在位置以及命令的可执行文件的位置.具体可以看下图:

开发过程

项目目录

项目目录结构如图所示:

简单介绍一下目录结构:
bin/sj.js 就是定义命令的文件
commands是存放具体命令的执行逻辑函数
utils就是存放通常的工具函数
templates用来存放项目模板

项目踩坑

1.process.on('SIGINT'):

process.on()是用来监听程序的一些特殊信号以及事件,上面的就是用来监听程序中断的(通常是由ctrl + c操作导致的).程序里使用了inquirer,版本是v6.x,该库底层是通过node readline模块实现的,readline模块实现了监听ctrl + c然后发送SIGINT信号给当前readline Interface的实例,具体查看readline代码777~788行

但是inquirer自身在这一层监听的处理函数里进行一些额外的操作然后通过process.kill再次发送SIGINT信号,具体查看代码

但是中间不知出了什么问题,导致程序在执行到inquirer.prompt的时候无法监听SIGINT信号.但是可以监听process.exit().所以相应的程序意外退出的一些clear操作只能在这里面执行了.详细了解可以查看issue

2.Node中的各种路径

. 进程当前执行脚本所在路径(__dirname)
. 进程当前执行路径(process.cwd())
. 进程开始执行的路径(process.env.PWD)

这里详细说一下process.cwd()和process.env.PWD之间的区别:

  1. process.env.PWD指的是进程开始执行的所在路径,举个例子: 在A路径下执行node test.js那么这个进程的 process.env.PWD就是A(在进程结束之前是不会变的).
  2. process.cwd()指的的进程当前执行到的路径,不一定是进程开始执行的路径.举个例子:在test.js里面你可能执行了切换路径的操作如process.chdir(B)等,那么这个进程现在的process.cwd()就变成了B

下面以一个具体的例子给大家展示一下具体的区别:

console.log('before change dir, process.env.PWD is ', process.env.PWD)
console.log('before change dir, process.cwd() is ', process.cwd())

process.chdir('../')

console.log('after change dir, process.env.PWD is ', process.env.PWD)
console.log('after change dir, process.cwd() is ', process.cwd())

下面是上面的结果图:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Node nodejs
Projects
None yet
Development

No branches or pull requests

1 participant