You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
inquirer.prompt([{name: 'description',message: 'Please enter the project description: '},{name: 'author',message: 'Please enter the author name: '}]).then((answer)=>{//...});
视觉美化
在用户输入之后,开始下载模板,这时候使用 ora 来提示用户正在下载模板,下载结束之后,也给出提示。
import{RC,DEFAULTS}from'./constants';import{decode,encode}from'ini';import{promisify}from'util';importchalkfrom'chalk';importfsfrom'fs';constexits=promisify(fs.exists);constreadFile=promisify(fs.readFile);constwriteFile=promisify(fs.writeFile);//RC 是配置文件//DEFAULTS 是默认的配置exportconstget=async(key)=>{constexit=awaitexits(RC);letopts;if(exit){opts=awaitreadFile(RC,'utf8');opts=decode(opts);returnopts[key];}return'';}exportconstgetAll=async()=>{constexit=awaitexits(RC);letopts;if(exit){opts=awaitreadFile(RC,'utf8');opts=decode(opts);returnopts;}return{};}exportconstset=async(key,value)=>{constexit=awaitexits(RC);letopts;if(exit){opts=awaitreadFile(RC,'utf8');opts=decode(opts);if(!key){console.log(chalk.red(chalk.bold('Error:')),chalk.red('key is required'));return;}if(!value){console.log(chalk.red(chalk.bold('Error:')),chalk.red('value is required'));return;}Object.assign(opts,{[key]: value});}else{opts=Object.assign(DEFAULTS,{[key]: value});}awaitwriteFile(RC,encode(opts),'utf8');}exportconstremove=async(key)=>{constexit=awaitexits(RC);letopts;if(exit){opts=awaitreadFile(RC,'utf8');opts=decode(opts);deleteopts[key];awaitwriteFile(RC,encode(opts),'utf8');}}
脚手架
vue-cli
,create-react-app
、react-native-cli
等都是非常优秀的脚手架,通过脚手架,我们可以快速初始化一个项目,无需自己从零开始一步步配置,有效提升开发体验。尽管这些脚手架非常优秀,但是未必是符合我们的实际应用的,我们可以定制一个属于自己的脚手架(或公司通用脚手架),来提升自己的开发效率。实现的功能
在开始之前,我们需要明确自己的脚手架需要哪些功能。
vue init template-name project-name
、create-react-app project-name
。我们这次编写的脚手架(eos-cli)具备以下能力(脚手架的名字爱叫啥叫啥,我选用了Eos黎明女神):eos init template-name project-name
根据远程模板,初始化一个项目(远程模板可配置)eos config set <key> <value>
修改配置信息eos config get [<key>]
查看配置信息eos --version
查看当前版本号eos -h
大家可以自行扩展其它的
commander
,本篇文章旨在教大家如何实现一个脚手架。本项目完整代码请戳(建议先clone代码): https://github.com/YvetteLau/Blog/tree/master/eos-cli
初始化一个项目
修改.eosrc文件,从 vuejs-template 下载模板
需要使用的第三方库
关于这些第三方库的说明,可以直接npm上查看相应的说明,此处不一一展开。
初始化项目
创建一个空项目(eos-cli),使用
npm init
进行初始化。安装依赖
目录结构
babel 配置
开发使用了ES6语法,使用
babel
进行转义,eos
命令node.js 内置了对命令行操作的支持,
package.json
中的bin
字段可以定义命令名和关联的执行文件。在package.json
中添加bin
字段行首加入一行
#!/usr/bin/env node
指定当前脚本由node.js进行解析链接到全局环境
开发过程中为了方便调试,在当前的
eos-cli
目录下执行npm link
,将eos
命令链接到全局环境。启动项目
处理命令行
利用
commander
来处理命令行。下载模板
download-git-repo
支持从 Github、Gitlab 下载远程仓库到本地。init
命令命令行交互
在用户执行 init 命令后,向用户提出问题,接收用户的输入并作出相应的处理。命令行交互利用
inquirer
来实现:视觉美化
在用户输入之后,开始下载模板,这时候使用
ora
来提示用户正在下载模板,下载结束之后,也给出提示。config
配置eos config set registry vuejs-templates
config 配置,支持我们使用其它仓库的模板,例如,我们可以使用 vuejs-templates 中的仓库作为模板。这样有一个好处:更新模板无需重新发布脚手架,使用者无需重新安装,并且可以自由选择下载目标。
.eosrc 文件的增删改查
发布
npm publish
将本脚手架发布至npm上。其它用户可以通过npm install eos-cli -g
全局安装。即可使用
eos
命令。项目地址
本项目完整代码请戳: https://github.com/YvetteLau/Blog/tree/master/eos-cli
编写本文,虽然花费了一定时间,但是在这个过程中,我也学习到了很多知识,谢谢各位小伙伴愿意花费宝贵的时间阅读本文,如果本文给了您一点帮助或者是启发,请不要吝啬你的赞和Star,您的肯定是我前进的最大动力。
https://github.com/YvetteLau/Blog
参考文章:
[1] 珠峰架构课(墙裂推荐)
[2] npm依赖文档(https://www.npmjs.com/package/download-git-repo)
The text was updated successfully, but these errors were encountered: