越努力,越幸运,做个ccode~

0%

如何使用cli及脚手架原理

如何使用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 添加到了环境变量中