代码
1、在package.json中增加
{
"name": "test",
"version": "1.0.0",
"bin": {
"kkb": "./bin/kkb.js"
},
...
}
2、终端中执行
kkb init mytest
3、具体的代码
kkb.js
#!/usr/bin/env node
// 指定解释器
// node.js命令行界面的完整解决方案
const program = require("commander")
// 指定版本号
program.version(require("../package.json").version)
// 增加初始化命令
program.command("init <name>").description('init project').action(require("../lib/init"))
program.parse(process.argv)
init.js
// Node8 就提供了 util.promisify() 这个方法,方便我们快捷的把原来的异步回调方法改成返回 Promise 实例的方法
const {promisify} = require("util")
// 「FIGlet」是基于ASCII字符组成的字符画
const figlet = promisify(require("figlet"))
const clear = require("clear")
//node终端样式库
const chalk = require("chalk")
const log = content => console.log(chalk.green(content))
const clone = require("./download")
const open = require("open")
const spawn = async (...args) => {
// child_process 模块提供了衍生子进程(以一种与 popen(3) 类似但不相同的方式)的能力
const {spawn} = require("child_process")
return new Promise(resolve => {
const proc = spawn(...args)
proc.stdout.pipe(process.stdout)
proc.stderr.pipe(process.stderr)
proc.on("close", () => {
resolve();
})
})
}
module.exports = async name => {
// 打印欢迎页
clear()
const data = await figlet('kkb welcome')
log(data)
// 下载项目
log(`🚀创建项目: ${name}`)
await clone ("github:su37josephxia/vue-sample", name)
// 自动安装依赖
log(`🚀安装依赖`)
await spawn("cnpm", [install], {cwd: `./${name}`})
log(`🚀安装完成`)
// 打开浏览器
open(`http://localhost:8080`)
//自动启动
await spawn("npm", ["run", "serve"], {cwd: `./${name}`})
}
download.js
const {promisify} = require("util")
module.exports = async function (repo, desc) {
// 从git下载文件
const download = promisify(require('download-git-repo'))
// 下载进度条
const ora = require("ora")
const progress = ora(`下载...${repo}`)
process.start()
await download(repo, desc)
process.succeed()
}