node实现编写cli命令行、克隆项目、安装依赖、启动项目

84 阅读1分钟

创建工程

mkdir vue-auto-router-cli
cd vue-auto-router-cli
npm init -y
npm i commander download-git-repo ora handlebars figlet clear chalk open -s

# bin/kkb.js #指定脚本解释器为node #!/usr/bin/env node console.log('cli.....')
# package.json
"bin": {
  "kkb": "./bin/kkb.js"
 },

# 将npm 模块链接到对应的运行项目中去 
npm link
# 删除的情况
ls /usr/local/bin/ rm /usr/local/bin/kkb

定制命令行界面

kkb.js文件

#!/usr/bin/env node
const program = require('commander') 
program.version(require('../package').version)
program
.command('init <name>') 
.description('init project') 
.action(name => {
  console.log('init ' + name)
}) 
program.parse(process.argv)
 

打印欢迎界面

/lib/init.js

const {promisify} = require('util')
const figlet = promisify(require('figlet'))
const clear = require('clear')
const chalk = require('chalk')
const log = content => console.log(chalk.green(content)) 
module.exports = async name => {
// 打印欢迎画面
clear()
 const data = await figlet('KKB Welcome') log(data)
}

//bin/kkb.js
program
.command('init <name>') 
.description('init project') 
.action(require('../lib/init'))

克隆脚手架

/lib/download.js

const {promisify} = require('util') 
module.exports.clone = async function(repo,desc) {
const download = promisify(require('download-git-repo')) 
const ora = require('ora')
const process = ora(`下载.....${repo}`)
process.start()
    await download(repo, desc)
process.succeed() }

/lib/init.js

const {clone} = require('./download') 
module.exports.init = async name => {
	//console.log('init ' + name)
	log('🚀创建项目:' + name)
	// 从github克隆项目到指定文件夹
	await clone('github:su37josephxia/vue-template', name)
}

安装依赖

// promisiy化spawn
// 对接输出流
const spawn = async (...args) => {
    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.init = async name => {
// ....
log('安装依赖')
await spawn('cnpm', ['install'], { cwd: `./${name}` }) 
log(chalk.green(`
👌安装完成:
To get Start: ===========================
cd ${name}
    npm run serve
===========================
`))
}

启动项目

const open = require("open") 
module.exports.init = async name => {
   // ...
  // 打开浏览器
  open(`http://localhost:8080`);
  await spawn('npm', ['run', 'serve'], { cwd: `./${name}` })
}