使用

一个公司,大概率上,会定义很多开发规则,而且在开发习惯上也会有很多相似的地方。这样每个项目类似的目录结构和配置。每一次搭建新项目就需要重新写一遍,这即“重复性工作”。为了减少这些“重复性工作”,cli(command line interface)出现,少量的参数即可自动搭建出一个项目雏形。著名的CLI有vue-cli,create-react-app等

  • 利用node的npm来实现一个cli非常简单而且使用也非常方便

    • 首先创建一个npm包,npm init

      当前目录下会出现package.json

    • 在package.json下添加“bin”属性

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      {
      "name": "idkhts-cli-demo",
      "version": "1.0",
      "description": "lll",
      "main": "index.js",
      "scripts": {
      "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "hgg",
      "license": "ISC",

      //添加bin
      "bin":{
      "cli":"./index.js"
      }
      }

      package.json的bin是npm提供的一个把执行文件快速注册到PATH的便捷方式,npm在下载的时候就会把bin属性下的值——执行的文件,符号链接(软链)到

      • 并且添加到npm的PATH路径变量下——全局安装
      • ./node_modules/.bin——局部安装

      全局安装后,执行对应的命令,cli,命令行后会查询PATH然后找到对应的文件执行;

      若是局部安装,直接执行命令cli会报错,因为在PATH路径变量中并没有存在对应的可执行文件或软链。这种情况只能自己复制或者使用npm run,在package.json文件的scripts属性加上自己的命令,如

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      // package.json
      {
      ...
      "scripts": {
      "test": "echo \"Error: no test specified\" && exit 1"
      //添加自定义命令
      "nrcli":"cli"
      },
      ...
      //添加bin
      "bin":{
      "cli":"./index.js"
      }
      }

      局部安装会把bin的定义的key生成文件名,所以在scripts定义的命令内容也是写cli,因为npm run是自动去寻找./node_modules/.bin文件,所以执行npm run nrcli意为“执行文件./node_modules/.bin/cli”

    • 接下来,定义入口文件。因为前面只是配置了命令执行什么文件,但是系统还不知道要怎么执行文件,这样如果不是可执行文件都会报错。配置用node.js执行,在入口文件的顶部加上:

      index.js

      1
      2
      #! /usr/bin/env node
      // do something ...

      这样,当系统执行文件时,读取第一行就知道当前文件应该在node环境下执行。

  • 推送到npmnpm publish

  • 使用

    • 局部安装
      • 安装npm i <cli-name> --save-dev
      • 修改package.json的script属性: 添加"nr-cmd":"cli-cmd"
      • 执行npm run nr-cmd

全局安装:

  • 安装npm i <cli-name> -g
  • 执行命令<cli-name> 即可

随记

  • 比较好用的开发命令行工具的包commdaner.js

    • version可以这样定义program.version(require("./package.json").version)自动和package.json的version对应
    • 没有定义的命令,自带提示“错误命令”;自带-h | --help命令支持
    • 踩过的坑是,最后一定要执行一句program.parse(process.argv)
  • npm发布前想要在本地测试,可以使用命令npm link

    • 在需要发布的npm包目录下,执行命令npm link,然后npm就会把当前包生成软链添加到npm的全局路径下,并且添加入口文件的软链放npm的PATH路径变量下。若是写的包有定义bin属性,npm link就可以直接执行命令了;

    • 若不是cli类的,需要加载到某个具体项目使用的,可以再在需要使用的项目根目录,执行命令npm link <package-name>,加载到具体的目录上;

      因为是软链,当在具体项目中npm link <packge-name>加载了某个本地npm包,然后在项目中修改node_module中依赖会直接修改本地npm包

    • npm link的效果其实和npm i -g是一样的,只是前者来源是本地,后者是npm服务器;npm link生成的是软链,所以本地修改包的效果会直接同步(本来就是执行本地的文件)

参考

用一次就会爱上的cli工具开发

package.json | npm Docs

npm scripts使用指南

PATH环境变量

最后更新: 2021年07月15日 23:55

原始链接: https://idkhts.github.io/2021/01/19/node%E5%BC%80%E5%8F%91cli/