如何使用cli
在《写一个cli脚手架中》使用了npm link 来使用 my-cli
但是使用npm link 只是为了方便在开发的时候测试 但是我们要想在一个项目中使用脚手架的命令怎么用呢?
很简单 直接
1 | npm install <cli-package-name> |
原理分析
但是为什么可以这样做呢?
我发现 npm install 的时候其实是做了两件事
- 根据package.json 安装项目依赖
- 在node_modules/.bin 下创建所有依赖项bin字段下所有命令的软链接
先将{prefix}/bin/{name}
下的test2命令删除
比如 现在我在my-cli 同级目录下新建 test-my-cli 目录
1 | mkdir test-my-cli |
2 | cd test-my-cli |
3 | npm init -y |
4 | npm install ../my-cli |

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

但是这样使用起来很麻烦 我们通常都不是这么用的 而是将命令写在package.json 中的scripts 字段中
1 | "scripts": { |
2 | "test": "test2 init aaa" |
3 | } |
然后再运行 npm run test
也可以执行test2 命令

那么这是为什么呢?为什么放在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:
1 | "scripts": {"test": "tap test/\*.js"} |
instead of
1 | "scripts": {"test": "node_modules/.bin/tap test/\*.js"} |
原来是npm run 的时候将当前目录下的 node_modules/.bin 添加到了环境变量中