设为首页 收藏本站
查看: 1161|回复: 0

[经验分享] Node.js编写CLI的实践

[复制链接]

尚未签到

发表于 2017-6-4 09:29:10 | 显示全部楼层 |阅读模式
  导语:通常而言,Node.js的应用场景有前后端分离、海量web页面渲染服务、命令行工具和桌面端应用等等。本篇文章选取CLI(Command Line Tools)子领域,来谈谈Node.js编写CLI的实践,让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
DSC0000.jpg

  注: 此处的Logo使用的是figlet这个npm包来帮助生成, demo地址

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命令行参数解析、核心命令以及插件机制。设计插件主要是为了保持整体功能的稳定,避免频繁升级;同时开放能力,支持开发者接入,完善整体的生态。
DSC0001.jpg


扫描器的实现
  在一个工程项目中,有各种各样的规范,比如项目命名规范、描述规范、目录结构规范、README.md规范,是否增加基本监控等等。编写扫描器scanner,对某个Group里面的所有业务项目进行扫描,将不符合规范的仓库和不符合规范的地方列举出来,并且捞出责任人。最后通过邮件及定时任务发送给相关同学,并且敦促修改。扫描器流程图如下:
DSC0002.jpg

  首先,需要一个任务队列,队列里面存放不同的扫描任务。每个扫描任务依赖相关的文件信息或者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里面,并且写入到配置文件里面。


  • 本地模块注册机制
DSC0003.jpg



  • 本地模块发现机制
DSC0004.jpg



  • npm 的 registry服务

    • npm的查询服务网址: http://registry.npmjs.org/
    • 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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-383365-1-1.html 上篇帖子: CentOS6.8 编译安装LNMP 下篇帖子: Hexo博客搭建
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表