美文网首页
npm全局包及cli制作方法

npm全局包及cli制作方法

作者: 长不大的嘤嘤怪 | 来源:发表于2019-04-02 11:33 被阅读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包指向的实际位置

    相关文章

      网友评论

          本文标题:npm全局包及cli制作方法

          本文链接:https://www.haomeiwen.com/subject/gxlbbqtx.html