当前位置:网站首页>脚手架开发进阶
脚手架开发进阶
2022-07-05 10:21:00 【码小龙.】
进阶
Cli命令行工具
什么是命令行工具
Cmmand Line Inetrface, 简称cli, 也就是在命令行终端中使用的工具
作用
极大的提升了开发效率与质量
可以通过这些脚手架工具在本地快速的构建我们的项目
为什么要学习cli命令行工具呢
如果长时间依赖gui完成全部工作, 将会错过自动化、高效工程化等技术能力
也无法将工具结合, 创建出定制的宏工具
创建命令行自定义命令
目录结构
|-szr-cli-code
|–bin
|—szr.js
|–package.json
配置package.json
“bin”: {
“szr”: “./bin/szr.js”
}
配置脚本编译
// szr.js
#!/usr/bin/env node // 表示在node环境中运行
console.log(“szr190”)
配置到环境变量中
$ cd szr-cli-code
$ npm link
$ szr
$ szr190 // 打印出的内容
原生接收命令行参数
/**
- return
- [
‘C:\Program Files\nodejs\node.exe’, // node的可执行文件的绝对路径
‘C:\Users\szr190\AppData\Roaming\npm\node_modules\szr-cli-code\bin\szr.js’ // 正在执行的Javascript文件路径
] - 从第三个参数开始:就是我们通过命令行传递进入的参数
/
console.log(process.argv)
Commander
cnpm install commander -S
// szr.js
const { program } = require(‘commander’)
program
.version(‘0.0.1’) // 设置版本
.usage(‘ [szr options]’)
.option(‘-cr, --classroom <custom classroom’s name>’, ‘current classroom name’, ‘szr190’) // 命令, 介绍, 值
.command(‘add’, ‘add a szr template’)
.command(‘init’, ‘add a init desc’) // 配置Commands命令和描述
.parse(process.argv) // szr -V / szr -h
inquirer
cnpm install inquirer -S
基本使用
const inquirer = require(‘inquirer’)
// 定义基本的问答结构
// 1. 定义问题列表
const promptList = [
{
type: ‘input’,
message: ‘用户名’,
name: ‘username’,
default: ‘szr190’
},
{
type: ‘input’,
message: ‘请输入6位密码’,
name: ‘password’,
validate: (val) => {
if (val.match(/^\d{6}$/ig)) {
return true
}
return “请输入6位数字的密码”
}
}
]
// 2. 获取问题回答答案
inquirer.prompt(promptList).then(answers => {
console.log(answers)
})
是否模式
// 定义是否选择问题列表
const promptList = [
{
type: ‘confirm’,
message: ‘是否使用监听模式’,
name: ‘watch’,
prefix: '’
},
{
type: ‘confirm’,
message: ‘是否进行文件的批量监听’,
name: ‘more-watch’,
suffix: ‘!’,
when: (answers) => {
if (answers.watch) {
return true
} else {
return false
}
}
}
]
// 2. 获取问题回答答案
inquirer.prompt(promptList).then(answers => {
console.log(answers)
})
单选模式
// 定义列表单选模式
const promptList = [
{
type: ‘list’,
message: ‘请选择一种单页面前端技术’,
name: ‘technology’,
choices: [‘Vue’, ‘React’, ‘Angular’]
}
]
// 2. 获取问题回答答案
inquirer.prompt(promptList).then(answers => {
console.log(answers)
})
多选模式
// 定义列表多选模式
const promptList = [
{
type: ‘checkbox’,
message: ‘选择UI框架’,
name: ‘ui’,
choices: [‘ElementUI’, ‘AntDesign Vue’, ‘Bootstrap Vue’, ‘Iview’]
// pageSize: 3
}
]
// 2. 获取问题回答答案
inquirer.prompt(promptList).then(answers => {
console.log(answers)
})
密码 & 文本
// 密码 & 文本
const promptList = [
{
type: ‘password’,
message: ‘请输入密码’,
name: ‘pwd’
},
{
type: ‘editor’,
message: ‘请输入备注文本’,
name: ‘bz’
}
]
// 2. 获取问题回答答案
inquirer.prompt(promptList).then(answers => {
console.log(answers)
})
ora
cnpm install ora -S
const ora = require(‘ora’)
const spinner = ora(‘开始下载, 加载中…’).start()
spinner.color = ‘green’
setTimeout(() => {
spinner.stop() // 停止加载
// spinner.succeed(‘恭喜下载成功’)
// spinner.fail(‘下载失败!’)
// spinner.warn(‘下载遇到问题, 请检查’)
// spinner.info(‘哈喽, 您有一个消息’)
}, 2500)
chalk
cnpm install chalk -S
const chalk = require(‘chalk’)
const log = console.log
log(chalk.red(‘szr190’)) // green yellow white gray/ bgRed背景
// 段落
log(chalk 大家好, 我是{red.bold Szr190}
)
download-git-repo
cnpm install download-git-repo -S
const download = require(‘download-git-repo’)
// download(仓库地址, 本地存放地址, 选项配置, 回调函数)
download(‘vuejs/awesome-vue’, ‘project/awe’, {
// clone: true,
// proxy: ‘’,
// headers: {},
// filetr: {}
}, (err) => {
if (err) {
throw new Error(‘error’)
} else {
console.log(‘成功’)
}
})
开发脚手架流程
1、创建脚手架命令
// szr.js
const { program } = require(‘commander’)
program
.version(‘1.0.0’)
.usage(‘<command [project options]>’)
.command(‘add’, ‘add a project template’)
.command(‘delete’, ‘delete project template’)
.command(‘list’, ‘list all’)
.command(‘init’, ‘generate a new project’)
.parse(process.argv)
2、创建命令可执行文件
|-bin
|–szr-add.js
|–szr-delete.js
|–szr-init.js
|–szr-list.js
// package.json
“bin”: {
“szr”: “./bin/szr.js”,
“szr-add”: “./bin/szr-add.js”,
“szr-delete”: “./bin/szr-delete.js”,
“szr-list”: “./bin/szr-list.js”,
“szr-init”: “./bin/szr-init.js”
}
$ npm link // 挂载到全局
$ szr add/delete/init/list
3、add命令
// szr-add.js
#!/usr/bin/env node
// 创建模板, 将用户的问答信息存储在本地
// 引入问答交互模块
const inquirer = require(‘inquirer’)
// 引入文件交互系统 fs-文件操作模块
const fs = require(‘fs’)
// 引入路径操作模块 path
const path = require(‘path’)
// 获取模板文件
const tpath = path.resolve(__dirname, ‘…/szr-template.json’) // 根目录创建的本地json存储文件
// 获取模板列表内容
let szrTlps = require(tpath) // 默认是[]
// 定制问答环节
let questions = [
{
type: ‘input’,
name: ‘tpl-name’,
message: ‘请输入模板名称’,
// 验证:必须输入, 并且不能重复
validate: (val) => {
if (!val) return ‘模板名称不能为空’
if (szrTlps.filter(v => (v.name === val)).length > 0) return ‘当前模板已经存在’
return true
}
},
{
type: ‘input’,
name: ‘tpl-url’,
message: ‘请输入模板的地址’,
// 验证:必须输入
validate: (val) => {
if (!val) return ‘模板地址不能为空’
return true
}
}
]
// 交互式问答, 信息处理
inquirer
.prompt(questions)
.then(answers => {
// 获取问答内容
let tplName = answers[‘tpl-name’]
let tplUrl = answers[‘tpl-url’]
// 更新到szr-template模板文件中去
szrTlps.push({
name: tplName,
url: tplUrl
})
// 更新文件内容
fs.writeFileSync(tpath, JSON.stringify(szrTlps))
})
4、delete命令
// szt-delete.js
#!/usr/bin/env node
// 引入问答交互模块
const inquirer = require(‘inquirer’)
// 引入文件交互系统 fs-文件操作模块
const fs = require(‘fs’)
// 引入路径操作模块 path
const path = require(‘path’)
// 获取模板文件
const tpath = path.resolve(__dirname, ‘…/szr-template.json’)
// 获取模板列表内容
let szrTlps = require(tpath) // 默认是[]
// 引入chalk
const chalk = require(‘chalk’)
let questions = [
{
type: ‘input’,
name: ‘tpl-name’,
message: ‘请输入要删除的模板名称’,
// 验证:必须输入, 并且不能重复
validate: (val) => {
if (!val) return ‘模板名称不能为空’
if (szrTlps.filter(v => (v.name === val)).length == 0) return ‘当前要删除的模板不存在’
return true
}
}
]
// 交互式问答, 信息处理
inquirer
.prompt(questions)
.then(answers => {
// 获取问答内容
let tplName = answers[‘tpl-name’]
// 更新文件内容
fs.writeFileSync(tpath, JSON.stringify(szrTlps.filter(v => (v.name !== tplName))))
// 打印成功信息
console.log(chalk.green(‘删除成功’))
})
5、list命令
// szr-list.js
#!/usr/bin/env node
// 引入文件交互系统 fs-文件操作模块
const fs = require(‘fs’)
// 引入路径操作模块 path
const path = require(‘path’)
// 获取模板文件
const tpath = path.resolve(__dirname, ‘…/szr-template.json’)
// 获取模板列表内容
let szrTlps = require(tpath) // 默认是[]
// 引入chalk
const chalk = require(‘chalk’)
szrTlps.forEach(v => {
console.log(chalk模板名称:{green ${v.name}}, 模板地址:{red ${v.url}}
)
})
6、init命令
// szr-init.js
#!/usr/bin/env node
// 引入命令行模块
const { program } = require(‘commander’)
// 引入远程下载模块
const download = require(‘download-git-repo’)
// 加载模块
const ora = require(‘ora’)
// 引入文件交互系统 fs-文件操作模块
const fs = require(‘fs’)
// 引入路径操作模块 path
const path = require(‘path’)
// 获取模板文件
const tpath = path.resolve(__dirname, ‘…/szr-template.json’)
// 获取模板列表内容
let szrTlps = require(tpath) // 默认是[]
// 引入chalk
const chalk = require(‘chalk’)
// 定义命令 szr init [project name]
program
.usage(‘ [project-name]’)
.parse(process.argv)
// 当没有输入参数的时候, 即:直接使用szr命令的时候
if (program.args.length < 1) {
program.help()
} else {
// 获取用户输入的参数
let tName = program.args[0]
let pName = program.args[1]
// console.log(tName, pName)
if (szrTlps.filter(v => (v.name === tName)).length === 0) { // 输入的是否在szr-template.json中
console.log(chalk.red(‘模板名称不存在, 请使用 szr list 命令查看可输入的模板’))
} else if (!pName) { // 校验输入的项目名称是否存在
console.log(chalk.red(‘项目文件夹名称不能为空’))
} else {
// 获取模板地址
let url = szrTlps.filter(v => (v.name === tName))[0].url
// 开始创建项目
console.log(chalk.yellow(‘开始创建项目’))
// 创建加载图标
const spinner = ora(‘下载拉取中…’)
spinner.start()
// 传入参数进行下载
download(‘direct:’ + url, pName, { clone: true }, err => {
if (err) {
spinner.fail()
console.log(chalk.red(‘创建目录失败’ + err))
return
}
// 成功加载
spinner.succeed()
console.log(chalk.green(‘创建目录成功’))
})
}
}
npm发布 && 全局安装使用
$ touch .npmignore // 添加ignore忽略文件
$ touch README.md // 添加md文档, 进行描述
$ npm publish // 输入npm的账号和密码, 可能还需要使用邮箱获取登录串才可
$ npm i szr-cli-code -g
$ szr
$ szr list
$ szr delete
$ szr add
$ szr init cli-test-demo cli-project
边栏推荐
- 学习笔记5--高精地图解决方案
- Error: module not found: error: can't resolve 'xxx' in 'XXXX‘
- Learning note 4 -- Key Technologies of high-precision map (Part 2)
- Detailed explanation of the use of staticlayout
- SAP ui5 objectpagelayout control usage sharing
- [vite] 1371 - develop vite plug-ins by hand
- [论文阅读] CKAN: Collaborative Knowledge-aware Atentive Network for Recommender Systems
- 【SWT组件】内容滚动组件 ScrolledComposite
- Usage differences between isempty and isblank
- LiveData 面试题库、解答---LiveData 面试 7 连问~
猜你喜欢
[论文阅读] KGAT: Knowledge Graph Attention Network for Recommendation
@Serializedname annotation use
5g NR system architecture
mongoDB副本集
AtCoder Beginner Contest 258「ABCDEFG」
How to judge that the thread pool has completed all tasks?
重磅:国产IDE发布,由阿里研发,完全开源!
[paper reading] ckan: collaborative knowledge aware autonomous network for adviser systems
Learning notes 5 - high precision map solution
[论文阅读] CKAN: Collaborative Knowledge-aware Atentive Network for Recommender Systems
随机推荐
C language QQ chat room small project [complete source code]
Comparative learning in the period of "arms race"
Have the bosses ever encountered such problems in the implementation of flinksql by Flink CDC mongdb?
ConstraintLayout官方提供圆角ImageFilterView
ByteDance Interviewer: how to calculate the memory size occupied by a picture
PHP solves the problems of cache avalanche, cache penetration and cache breakdown of redis
微信小程序触底加载与下拉刷新的实现
WorkManager學習一
dsPIC33EP 时钟初始化程序
csdn软件测试入门的测试基本流程
Constrained layout flow
What is the most suitable book for programmers to engage in open source?
Nine degrees 1480: maximum ascending subsequence sum (dynamic programming idea for the maximum value)
请问postgresql cdc 怎么设置单独的增量模式呀,debezium.snapshot.mo
Singleton mode encapsulates activity management class
微信小程序中,从一个页面跳转到另一个页面后,在返回后发现页面同步滚动了
学习笔记4--高精度地图关键技术(下)
[论文阅读] CKAN: Collaborative Knowledge-aware Atentive Network for Recommender Systems
beego跨域问题解决方案-亲试成功
@Serializedname annotation use