npm全局包及cli制作方法

2019-04-02  本文已影响0人  长不大的嘤嘤怪

全局命令注册:

首先说一下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包指向的实际位置

上一篇 下一篇

猜你喜欢

热点阅读