Node.js编写CLI的实例详解
why node.js?
常用的用来编写cli的语言有 python, ruby, perl, node.js等等。 为什么选取node.js作为cli的语言编写工具呢?有三个理由:
- 对javascript语言更加熟悉
- npm 完善的生态系统
- npm os无关的包管理机制
主要原因还是归咎于npm 完善的生态,目前npm官方有47.5万个三方包可供使用,你可以很方便的使用一些已经编写的很不错的*去帮你快速开发。另一方面,你不需要考虑跨平台的安装问题,比如osx上的homebrew、debian的aptitude、centos 上的yum。如果使用shell或者其它语言来编写cli,需要针对各个主流os来做兼容并且发布到不同的平台。
看个demo
注: 此处的logo使用的是这个npm包来帮助生成
npm关联cli的基本原理
如何让node.js编写的包可执行?其实很简单,只需要在package.json里面增加一个bin字段。模块发布到npm上后,开发者安装这个包的时候会检查是否有bin字段,如果有bin字段则会使用软链接的方式创建可以全局使用的命令。
如果模块采用全局安装的方式,对于类unix系统,会在/usr/local/bin目录创建软链接,对于windows系统,在c:\users\username\appdata\roaming\npm目录创建软链接。
如果模块采用局部安装的方式,则会在项目内的./node_modules/.bin目录创建软链接。
配置好的package.json如下:
… "description": "a command line tool aims to improve front-end engineer workflow.", "main": "lib/index.js", "bin" : { "feflow" : "./bin/feflow" } …
cli基本命令设计
$ feflow --help a command line tool aims to improve front-end engineer workflow usage: feflow [options] [command] commands: init choose a scaffold to initialize project. scan --receiver scan a group and mail to receiver install <plugin> install a plugin or a yeoman generator. options: --version, -[vv] print version and exit successful --help, print this help and exit successf
feflow的技术架构
feflow总体分为3个模块,包括parser命令行参数解析、核心命令以及插件机制。设计插件主要是为了保持整体功能的稳定,避免频繁升级;同时开放能力,支持开发者接入,完善整体的生态。
扫描器的实现
在一个工程项目中,有各种各样的规范,比如项目命名规范、描述规范、目录结构规范、readme.md规范,是否增加基本监控等等。编写扫描器scanner,对某个group里面的所有业务项目进行扫描,将不符合规范的仓库和不符合规范的地方列举出来,并且捞出责任人。最后通过邮件及定时任务发送给相关同学,并且敦促修改。扫描器流程图如下:
首先,需要一个任务队列,队列里面存放不同的扫描任务。每个扫描任务依赖相关的文件信息或者commit信息,这个时候需要调用git code提供的三方api进行文件信息拉取。之后,需要编写一个规则引擎,这个规则引擎里面有多个规范相关的检查工具,解析完成后会将结果生成html格式的字符串。最后调用邮件服务和定时任务服务去通知相关开发者。
插件机制设计
$ feflow install <plugin> # 安装一个插件, --force则会强制安装 $ feflow remove <plugin> # 卸载一个插件 $ feflow list # 列举出所有插件信息 $ feflow list <plugin> # 列举某个插件信息
插件机制实现
插件机制的实现包括两个部分:插件注册机制和插件发现机制。feflow要求插件必须以feflow-plugin-开头或者 generator-开头,generator作为一种特殊的插件,插件代码以npm包的形式存储和管理。运行feflow install plugin命令时,会通过npm 的 regsitry检查是否存在插件,如果存在,会检查当前插件是否是最新版本。如果不是最新版本,则提示用户是否需要更新。然后将插件下载到home目录下的.feflow目录(windows系统为"c:\users\username\.feflow" 目录)下的node_modules里面,并且写入到配置文件里面。
本地模块注册机制
本地模块发现机制
npm 的 registry服务
- npm的查询服务网址:
- registry网址后面跟上模块名、版本好可以查询模块详细信息,包括最新版本,以此来判断模块是否需要更新。比如:react的最新版本可以通过http://registry.npmjs.org/react/latest 来获得
- 返回的json对象里面有个dist.tarball属性,是某个版本的压缩包地址
常用三方包分享
- osenv 方便的获取不同系统的环境和目录配置
- figlet 命令行炫酷的logo生成器
- meow 命令行帮助命令封装
- inquire 强大的用户交互
- chalk 让命令行的output带有颜色
- easytable 表格信息展示,用于升级包的提示
- minimlist 用户输入的参数解析
- shelljs node.js执行shell命令
- clui 进度条
遇到的问题
1,windows下用户未设置home环境变量导致报错
解决办法: 由于windows下home环境变量并非默认存在,因此不能直接使用。判断process.platform === ‘win32',优先使用home变量,否则使用userprofile变量;建议使用osenv这个包。
2,osx平台运行feflow报错: env: node\r: no such file or directory
解决办法: 由于类unix系统的换行符号为\n,而windows系统为\n\r。修复换行问题。可以在工程根目录下加.gitattributes文件,设置* text eol=lf,这样git提交时就不会讲lf转换成crlf
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: bootstrap警告框示例代码分享
下一篇: 蛇死了