npm-cli

243 阅读1分钟
npm --version -> 8.2.0

which npm -> /usr/local/bin/npm

lf /usr/local/bin/npm -> 0 lrwxr-xr-x  1 kelwen  admin  38 Dec  8 16:07 /usr/local/bin/npm -> ../lib/node_modules/npm/bin/npm-cli.js

当前版本

8.2.0,8.x与7.x已经完全重构,主要体现在命令目录更清晰

目录结构

npm

  • bin - 可执行入口文件

  • docs - 所有命令文档

  • lib

  • auth,鉴权操作

  • commands - 命令目录,每个文件对应一个npm命令

  • ...

  • man - 命令man文档文件

index.js - packag main文件,^8.0.0开始不支持按main文件方式引入

main函数

/bin/npm-cli.js

#!/usr/bin/env node
require('../lib/cli.js')(process)

逻辑入口

/lib/cli.js

执行流程
  • 绑定uncaughtException及unhandledRejection

  • 创建npm实例

  • 版本更新提示,updateNotifier

  • 具体命令执行,根据process.argv来映射

Npm构造器

/lib/npm.js

核心逻辑
  • 加载config,承载npm lifecycle中所有的配置参数,npm config get/set可以进行操作

  • npm.exec(cmd, npm.argv),经过abbrevs及aliases查找最终cmd名称,开始执行命令

    async cmd (cmd) { await this.load() const command = this.deref(cmd) if (!command) { throw Object.assign(new Error(Unknown command ${cmd}), { code: 'EUNKNOWNCOMMAND', }) } const Impl = require(./commands/${command}.js) const impl = new Impl(this) return impl }