全局命令注册:
首先说一下npm全局包,npm install xxx -g 即为全局安装,全局安装的npm包一般都带有cmd命令,比如安装vue-cli后执行“vue create XXX”即可生成一个新的vue项目模版,再比如安装http-serve后执行“http-serve”命令可以本地起一个静态服务
那么这些全局命令怎么实现的呢?其实很简单只需要在package.json文件里增加一个 "bin" 属性即可:
"version": "0.0.1",
"description": "",
"bin": {
"vue-common": "./bin/index"
},
这样把包上传并全局安装后则会在本地注册一个全局命令,但是我们看到一般这种全局命令都会传若干个参数,例如最常见的:“npm i xxx -g”,"npm -version"这个是怎么做到的呢?这个时候“commander”该出场了,“npm install commander --save”即可本地安装保存,下面给一个简单的使用示例:
#!/usr/bin/env node
const program = require('commander')
program
.version('0.0.1', '-v, --version')
program.on('--help', function () {
console.log('no help can use')
});
program
.command('create <app-name>')
.description('create a new project')
.action((name, cmd) => {
console.log('your app name is ' + name);
console.log('your cmd is '+ cmd);
})
program.parse(process.argv);
其中上面的action里的回调方法接受两个参数,第二个参数实际上是一个object,借鉴vue-cli里的一个处理方法:
function camelize (str) {
return str.replace(/-(\w)/g, (_, c) => c ? c.toUpperCase() : '')
}
// commander passes the Command object itself as options,
// extract only actual options into a fresh object.
function cleanArgs (cmd) {
const args = {}
cmd.options.forEach(o => {
const key = camelize(o.long.replace(/^--/, ''))
// if an option is not present and Command has a method with the same name
// it should not be copied
if (typeof cmd[key] !== 'function' && typeof cmd[key] !== 'undefined') {
args[key] = cmd[key]
}
})
return args
}
有关于commander的用法就讲到这里,因为还有很多,如果直接看官方文档看不明白的可以选择直接阅读vue-cli的源码,里面相关的使用较多,可以参考借鉴
本地调试npm包:
执行npm link即可,该命令会生成一条软链,指向全局包,即
npm link
/usr/local/bin/vue-common -> /usr/local/lib/node_modules/vue-fe-common/bin/index.js
/usr/local/lib/node_modules/vue-fe-common -> /Users/dong/Desktop/draft/command
输出第一行的意思是“vue-common”命令指向的具体文件位置(这个位置并非包在本机的开发路径),第二行是被link到全局的vue-fe-common包指向的实际位置
网友评论