日常前端开发中,经常见到各种cli,如一行命令帮你生成vue项目模板的vue-cli。编写合适的命令行工具也可以快速构建出适合自己项目的模板。
node cli的本质其实就是执行node脚本。
先安装好node及npm: Nodejs官网下载
构建命令的基础需要一个执行文件nono.js及package.json配置文件。
一个命令行中可以由命令、参数和选项等组成,如:
//create就是命令 app就是参数
vue create app
//-l就是选项,还有-v,--version
ls -l
创建一个命令行工具源码目录并进入该目录
mkdir nono-cli
初始化package.json
// package.json的name将作为发布到npm上的包名称
npm init
初始化执行文件nono.js
// 在nono-cli文件夹下
mkdir bin
// 在bin文件夹下新建nono.js
touch nono.js
测试程序nono is run!
// 在nono.js中写入
// #!/usr/bin/env node 表示使用node作为脚本的解释程序,node的路径通过env来查找
// 本来需要这样运行node ./nono.js,但是加上了这句后就可以直接./nono.js运行
#!/usr/bin/env node
console.log('nono is run!')
package.json中添加bin字段,增加命令nono
"bin": {
"nono": "bin/nono.js"
}
将该命令行工具安装到本地全局
npm install . -g
命令行中输入nono,若正常打印nono is run!即表示测试通过
nono
通过建立软链接,当修改nono.js时,执行nono.js运行结果也会有变化
// 显示下面信息即链接成功
// /usr/local/bin/nono -> /usr/local/lib/node_modules/nono-cli/bin/nono.js
// /usr/local/lib/node_modules/nono-cli -> /Users/snow/program-files/my-study/node/nono-cli
npm link
// 修改nono.js 增加:
console.log('nono changes optionally')
// 再次执行命令nono,也会打印 nono changes optionally
用到的一些模块:
npm install commander inquirer ora chalk --save
require('commander')
// 指定版本
.version(require('../package').version)
// 使用说明
.usage(' [options]' )
// 创建命令
// .command('init')命令会找到同文件夹的xxx-init.js并执行
.command('init', 'generate a new project from a template')
.command('list', 'list available official templates')
.command('build', 'prototype a new project')
// 解析命令行
// parse这句很重要,最后都要加这句
.parse(process.argv)
var inquirer = require('inquirer');
inquirer
.prompt([
/* Pass your questions in here */
{
type: 'confirm',
name: 'install',
message: '是否安装依赖',
default: true
}
])
.then(answers => {
// Use user feedback for... whatever!!
// answers: {install: true/false}
});
const ora = require('ora');
spinner = ora('开始安装依赖...');
spinner.start();
....
spinner.succeed('初始化项目完成。')
spinner.stop();
//或者
const ora = require('ora');
ora().fail(err)
该项目可以通过选择下载不同的项目模板,配置自己的 package.json,并且可以选择是否要进行安装依赖。
#!/usr/bin/env node
// console.log('nono is run!')
// console.log('nono changes optionally')
const program = require('commander');
program
.usage(' [项目名称]' )
.version('1.0.3', '-v, --version')
// .command('init')命令会找到同文件夹的nono-init
.command('init', '初始化项目')
.parse(process.argv)
根据传入的项目名称及命令行中选择的模板进行模板下载。具体执行过程如下:
userdeMacBook-Pro:nono-cli snow$ nono init app
开始创建...
? 请选择模板 simple-vue
⠹ 开始下载模板,模板地址: git@github.com:helloGrape/simple-vue.gitstdout:
✔ 模板下载完成,开始配置配置文件
? 请输入项目名称 app
? 请输入项目版本 1.0.0
? 请输入项目描述
? 是否安装依赖 Yes
✔ 初始化项目完成。
选择你想选择的模板
module.exports = {
templateUrls: {
'test': 'https://code.aliyun.com/haokur/test.git',
'simple-vue': '[email protected]:helloGrape/simple-vue.git',
'vue-admain': '[email protected]:PanJiaChen/vue-admin-template.git'
}
}
在 npm 官网 https://www.npmjs.org 申请一个账号
npm adduser --registry http://registry.npmjs.org
指定registry为npm。这主要是区分本机已经安装了其它仓库例如cnpm的情况。
如果项目目录有所修改,则需要修改package.json中的version,修改之后再次执行 npm publish。
gitHub: https://github.com/helloGrape/nono-cli
参考:
https://blog.csdn.net/haokur/article/details/81460973
https://blog.csdn.net/wyc_cs/article/details/51568941
https://www.npmjs.com/package/commander
https://www.npmjs.com/package/inquirer