Node.js用途很广,经常使用来开发服务、桌面应用等被开发者熟知,Node.js还有另一个很是实用的场景 - 命令行应用(后文统称CLI)。node
本文可参考的源码:github.com/youngjuning…git
建立一个youngjuning
目录,并使用进入该目录:github
$ mkdir youngjuning && cd youngjuning
复制代码
在该目录下新建 index.js:shell
#!/usr/bin/env node
console.log('Hello World')
复制代码
使用 package.json
的 bin
项是用来指定各个内部命令对应的可执行文件的位置:npm
"bin": {
"youngjuning": "./bin/cli.js"
}
复制代码
在命令行输入 npn link
或 npm install -g
将当前项目安装到全局环境,这样就能够直接使用 youngjuning
来运行文件了:json
node 为咱们提供了 process.argv
来读取命令行参数,这里咱们对此不做介绍,有兴趣能够自行研究,我选择了 tj 大神的 commander:微信
command
: 定义命令行指令,后面可跟上一个 name,用空格隔开,如 .command( 'app [name]')
alias
: 定义一个更短的命令行指令description
: 描述,它会在 help 里面展现option
: 定义参数。它接受四个参数
-a
和长名字 –app
,使用 |
或者 ,
分隔,在命令行里使用时,这两个是等价的,区别是后者能够在程序里经过回调获取到help
信息里展现出来string
,有时候咱们须要一个命令行建立多个模块,就须要一个回调来处理action
: 注册一个 callback
函数,这里需注意目前回调不支持 let 声明变量parse
: 解析命令行const answers = await inquirer.prompt([
/* Pass your questions in here */
])
console.log(answers)
复制代码
type
: 表示提问的类型,包括:input
, confirm
, list
, rawlist
, expand
, checkbox
, password
, editor
;name
: 存储当前问题回答的变量;message
: 问题的描述;default
: 默认值;choices
: 列表选项,在某些 type 下可用,而且包含一个分隔符(separator);validate
: 对用户的回答进行校验;filter
: 对用户的回答进行过滤处理,返回处理后的值;transformer
: 对用户回答的显示效果进行处理(如:修改回答的字体或背景颜色),但不会影响最终的答案的内容;when
: 根据前面问题的回答,判断当前问题是否须要被回答;pageSize
: 修改某些 type
类型下的渲染行数;prefix
: 修改 message
默认前缀;suffix
: 修改 message
默认后缀。recursive-readdir
库递归读取项目全部文件handlebars
进行模板替换fs
模块进行读文件和写文件操做const fs = require('fs')
const handlebars = require('handlebars')
const recursive = require('recursive-readdir')
const compile = (meta, file) => {
const content = fs.readFileSync(file).toString()
const result = handlebars.compile(content)(meta)
fs.writeFileSync(file, result)
}
module.exports = (meta, src) => {
recursive(src, (err, files) => {
files.forEach(file => {
compile(meta, file)
})
})
}
复制代码
做者微信 | 知识星球 | 赞扬做者 |
---|---|---|
![]() |
![]() |
![]() |