407 字
2 分钟
如何使用cli及脚手架原理
2022-01-14

如何使用cli#

在《写一个cli脚手架中》使用了npm link 来使用 my-cli 但是使用npm link 只是为了方便在开发的时候测试 但是我们要想在一个项目中使用脚手架的命令怎么用呢?

很简单 直接

Terminal window
npm install <cli-package-name>

原理分析#

但是为什么可以这样做呢? 我发现 npm install 的时候其实是做了两件事

  • 根据package.json 安装项目依赖
  • 在node_modules/.bin 下创建所有依赖项bin字段下所有命令的软链接

先将{prefix}/bin/{name}下的test2命令删除

比如 现在我在my-cli 同级目录下新建 test-my-cli 目录

Terminal window
mkdir test-my-cli
cd test-my-cli
npm init -y
npm install ../my-cli

test-my-cli

可以看到node_modules/.bin 下存在两个软链接

npm run-script#

那么现在我们就可以执行my-cli中的命令了么? 直接执行test2 肯定不行(先将环境变量中的test2命令删除) 因为test2 是放在 node_modules/.bin目录下的 所以我们需要

Terminal window
./node_modules/.bin/test2

run-test2

但是这样使用起来很麻烦 我们通常都不是这么用的 而是将命令写在package.json 中的scripts 字段中

"scripts": {
"test": "test2 init aaa"
}

然后再运行 npm run test 也可以执行test2 命令

npm-run-test

那么这是为什么呢?为什么放在scripts 中就可以执行test2命令了?

In addition to the shell’s pre-existing PATH, npm run adds node_modules/.bin to the PATH provided to scripts. Any binaries provided by locally-installed dependencies can be used without the node_modules/.bin prefix.

For example, if there is a devDependency on tap in your package, you should write:

"scripts": {"test": "tap test/\*.js"}

instead of

"scripts": {"test": "node_modules/.bin/tap test/\*.js"}

原来是npm run 的时候将当前目录下的 node_modules/.bin 添加到了环境变量中

如何使用cli及脚手架原理
https://blog.cxyxiaoyu.top/posts/如何使用cli及脚手架原理/
作者
小宇
发布于
2022-01-14
许可协议
CC BY-NC-SA 4.0