"bin":{
"why":"index.js"
}
#! /usr/bin/env node;
const program=require('commander')
program.version('1.0.0');
program.parse(process.argv)
program.version(require('./package.json').version) 这个时候终端执行 why --version 打印出来的就是package.json的值了
program.version(require('./package.json').version,'-v,--version')
program.option('-w --why','a why cli');
这个时候再去终端输入命令why --helo查看帮助会有Options:-w --why a why cli ,但是这个命令目前没有意义。
program.option('-d --dest<dest>','a destination folder,例如:-d/src/components ')
终端输入命令:why -d /src/components;终端只要写上-d就必须要传入参数,不写-d则不用
console.log(program.dest)
13.program.on('--help',funtion(){
console.log('')
console.log('监听终端命令')
})
14.要对目录结构进行划分,在根目录新建lib,在lib里新建core和utils文件夹,
在core文件夹里面新建help.js文件
15.
const program=require('commander')
const helpOptions=()=>{
program.option('-w --why','a why cli')
program.option('-d --dest <dest>','a destination folder,例如: -d /src/components')
program.option('')
}
program.on('--help',function(){
console.log('')
console.log('监听终端命令')
})
module.exports={
helpOptions
}
const proaram=require('commander')
const helpOptins=require('./lib/core/help')
helpOtions()
16. 实现npm create demo指令创建项目,在core里面新建create.js文件
const proaram=require('commander')
const createCommand=()=>{
program.command('create <project> [others...]').description('clone repository into a floder').action((project,others)=>{
console.log(project,others)
})
}
module.exports=createCommands;
const paoaram=require('commander')
const helpOptins=require('./lib/core/help')
const createCommands=require('./lib/core/create')
helpOtions()
createCommands()
17.我们在corv文件夹下面新建一个actions,之后我们所有的指令的回调函数都封装到这里,用CommonJS规范导出
创建项目指令
- 创建解析create指令
- 通过download-git-repo从代码仓库下载模板
- 进入目录,并且执行’npm install’命令
- 执行’npm run serve’命令
- 打开浏览器
18.在lib文件夹新建一个config文件夹,在config文件夹新建一个repo-config.js文件
let vueRepo="direct:https://github.com/coderwhy/hy-vue-temp.git"
nodule.exports={
vueRepo
}
19. 在lib文件夹下新建utils文件夹,在utils文件夹下新建terminal.js封装执行终端命令相关的代码
const {spawn}=require('child_process')
const commandSpwn=(...args)=>{
return new Promise=((resolve,reject)=>{
const childProcess=spawn(...args);
childProcess.stdout.pipe(process.stout)
childProcess.stderr.pipe(process.stout)
childProcess.on('close',=>{
resolve();
})
})
}
module.exports={
commandSpwn
}
20.在actions写指令的回调函数
const download=promisify(require('download-git-repo'));
const {vueRepo}=require('../config/repo-config');
const {commandSpwn}=require('../utils/terminal')
const createProjectAction=async(project)=>{
await download(vueRepo,project,{clone:true});
const command=process.platform==="win32"?"npm.cmd":"npm"
await commandSpwn(command,['install'],{cwd:`${project}`})
}
module.exports={
createProjectAction
}
const proaram=require('commander')
cosnt {createProjectAction}=require('./actions');
const createCommands=()=>{
program
.command('create <project> [others...]')
.description('clone repository into a floder')
.action(createProjectAction)
}
module.exports.exports=createCommand
21.命令行执行 why create proJectname