1.0.1 • Published 2 years ago

bga-cli-basic v1.0.1

Weekly downloads
-
License
ISC
Repository
-
Last release
2 years ago

cli-basic

脚手架原理

➜  ~ which pnpm
/Users/wanghao/.nvm/versions/node/v14.17.3/bin/pnpm
➜  ~ ll /Users/wanghao/.nvm/versions/node/v14.17.3/bin
-rwxr-xr-x  1 wanghao  staff    73M Jul  5  2021 node
lrwxr-xr-x  1 wanghao  staff    37B Oct 14 18:16 pnpm -> ../lib/node_modules/pnpm/bin/pnpm.cjs
lrwxr-xr-x  1 wanghao  staff    37B Oct 14 18:16 pnpx -> ../lib/node_modules/pnpm/bin/pnpx.cjs
➜  ~ ls /Users/wanghao/.nvm/versions/node/v14.17.3/lib/node_modules/pnpm
LICENSE      README.md    bin          dist         package.json
➜  ~ cat /Users/wanghao/.nvm/versions/node/v14.17.3/lib/node_modules/pnpm/bin/pnpm.cjs
#!/usr/bin/env node
const [major, minor] = process.version.slice(1).split('.')
const COMPATIBILITY_PAGE = `Visit https://r.pnpm.io/comp to see the list of past pnpm versions with respective Node.js version support.`

// We don't use the semver library here because:
//  1. it is already bundled to dist/pnpm.cjs, so we would load it twice
//  2. we want this file to support potentially older Node.js versions than what semver supports
if (major < 14 || major == 14 && minor < 6) {
  console.log(`ERROR: This version of pnpm requires at least Node.js v14.6
The current version of Node.js is ${process.version}
${COMPATIBILITY_PAGE}`)
  process.exit(1)
}

require('../dist/pnpm.cjs')

// if you want to debug at your local env, you can use this
// require('../lib/pnpm')
  • 通过 which pnpm 来查看 pnpm 安装位置在 /Users/wanghao/.nvm/versions/node/v14.17.3/bin/pnpm,并且软链接到 /Users/wanghao/.nvm/versions/node/v14.17.3/lib/node_modules/pnpm/bin/pnpm.cjs
  • pnpm.cjs 第一行指定在环境变量中查找 node 命名来执行该文件

    #!/usr/bin/env node
    • (另一种不推荐的方式)直接执行 /usr/bin 目录下的 node
    #!/usr/bin/node
  • 为什么命令是叫 pnpm 呢?是因为在 package.json 中 bin 节点下指定了 key 为 pnpm

"bin": {
    "pnpm": "bin/pnpm.cjs",
    "pnpx": "bin/pnpx.cjs"
},
  • 执行 node xx.js 文件时,其实是把 js 文件中的代码变成了字符串传入到 node 中解释执行
➜  ~ node -e "console.log('bga')"
bga

脚手架开发流程

  • 创建 npm 项目
  • 创建脚手架入口文件,最上方添加
#!/usr/bin/env node
  • 配置 package.json,添加 bin 属性
  • 编写脚手架代码
  • 将脚手架发布到 npm

难点

  • 分包、命令注册、参数解析、options 全称、options 简写、带 params 的 options、帮助文档

发布

  • 登录指定 npm 服务器
npm login --registry https://registry.npmjs.org/
  • 在 package.json 中通过 publishConfig.registry 指定要发布的 npm 服务器地址
"publishConfig": {
    "registry": "https://registry.npmjs.org/"
},
  • 发布
npm publish
  • 使用
npm i bga-cli-basic -g --registry https://registry.npmjs.org/

调试

调试子包

  • 在全局 node_modules 目录中创建 bga-cli-basic-lib 软链接到本地 cli-basic-lib 目录
➜  bga-js-full-stack-note git:(main) ✗ cd cli-basic-lib
➜  cli-basic-lib git:(main) ✗ npm link
npm WARN bga-cli-basic-lib@1.0.0 No description
npm WARN bga-cli-basic-lib@1.0.0 No repository field.

up to date in 10.073s
/Users/wanghao/.nvm/versions/node/v14.17.3/lib/node_modules/bga-cli-basic-lib -> /Users/wanghao/git/VSCode/BGA/bga-js-full-stack-note/cli-basic-lib
  • 在 cli-basic-main 中使用软链接到全局的 bga-cli-basic-lib
➜  bga-js-full-stack-note git:(main) ✗ cd cli-basic-main
➜  cli-basic-main git:(main) ✗ npm link bga-cli-basic-lib
/Users/wanghao/git/VSCode/BGA/bga-js-full-stack-note/cli-basic-main/node_modules/bga-cli-basic-lib -> /Users/wanghao/.nvm/versions/node/v14.17.3/lib/node_modules/bga-cli-basic-lib -> /Users/wanghao/git/VSCode/BGA/bga-js-full-stack-note/cli-basic-lib
  • 如果要 unlink 的话,需要先到 cli-basic-main 中设置不软链接到全局的 bga-cli-basic-lib,然后再到 cli-basic-main 取消软链接到全局 node_modules。如果顺序反了的话会报错(解决方案一:直接删除 cli-basic-main/node_modules 中的 bga-cli-basic-lib;解决方案二:在 cli-basic-lib 中重新执行 link 到全局 node_modules 后才能在 cli-basic-main 中 unlink 成功),注意:unlink 的话会移除 package.json 的 dependencies 中的 bga-cli-basic-lib 依赖
cd cli-basic-main
# 先取消链接到全局的 bga-cli-basic-lib
npm unlink bga-cli-basic-lib
# 然后再重新安装发布后的 bga-cli-basic-lib
npm install -S bga-cli-basic-lib --registry https://registry.npmjs.org/

调试 cli

➜  cli-basic git:(main) ✗ npm link
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN bga-cli-basic@1.0.0 No repository field.

up to date in 10.094s
/Users/wanghao/.nvm/versions/node/v14.17.3/bin/bga-cli-basic -> /Users/wanghao/.nvm/versions/node/v14.17.3/lib/node_modules/bga-cli-basic/bin/index.js
/Users/wanghao/.nvm/versions/node/v14.17.3/lib/node_modules/bga-cli-basic -> /Users/wanghao/git/VSCode/BGA/bga-js-full-stack-note/cli-basic-main
1.0.1

2 years ago

1.0.0

2 years ago