导语:一般而言,Node.js的应用场景有先后端分离、海量web页面渲染服务、命令行工具和桌面端应用等等。本篇文章选取CLI(Command Line Tools)子领域,来谈谈Node.js编写CLI的实践,让CLI切实解决实际工程问题。前端
经常使用的用来编写CLI的语言有 python, ruby, perl, Node.js等等。 为何选取Node.js做为CLI的语言编写工具呢?有三个理由:node
主要缘由仍是归咎于npm 完善的生态,目前npm官方有47.5万个三方包可供使用,你能够很方便的使用一些已经编写的很不错的轮子去帮你快速开发。另外一方面,你不须要考虑跨平台的安装问题,好比OSX上的homebrew、Debian的aptitude、CentOS 上的yum。若是使用shell或者其它语言来编写CLI,须要针对各个主流OS来作兼容而且发布到不一样的平台。python
注: 此处的Logo使用的是figlet这个npm包来帮助生成, demo地址react
如何让Node.js编写的包可执行?其实很简单,只须要在package.json里面增长一个bin字段。模块发布到npm上后,开发者安装这个包的时候会检查是否有bin字段,若是有bin字段则会使用软连接的方式建立能够全局使用的命令。git
若是模块采用全局安装的方式,对于类unix系统,会在/usr/local/bin目录建立软连接,对于windows系统,在C:\Users\username\AppData\Roaming\npm目录建立软连接。github
若是模块采用局部安装的方式,则会在项目内的./node_modules/.bin目录建立软连接。web
配置好的package.json以下:shell
… "description": "A command line tool aims to improve front-end engineer workflow.", "main": "lib/index.js", "bin" : { "feflow" : "./bin/feflow" } …
$ 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整体分为3个模块,包括parser命令行参数解析、核心命令以及插件机制。设计插件主要是为了保持总体功能的稳定,避免频繁升级;同时开放能力,支持开发者接入,完善总体的生态。npm
在一个工程项目中,有各类各样的规范,好比项目命名规范、描述规范、目录结构规范、README.md规范,是否增长基本监控等等。编写扫描器scanner,对某个Group里面的全部业务项目进行扫描,将不符合规范的仓库和不符合规范的地方列举出来,而且捞出责任人。最后经过邮件及定时任务发送给相关同窗,而且敦促修改。扫描器流程图以下:json
首先,须要一个任务队列,队列里面存放不一样的扫描任务。每一个扫描任务依赖相关的文件信息或者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里面,而且写入到配置文件里面。
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