问题背景
我成功地把代码模板推给了团队:Ctrl ACV工程师的提效之路------plop自动生成代码
队友在用的时候,按照我文档里写的,在执行plop
命令的时候报错了,提示没有这个命令。针对这个问题,我做了一些探索。
首先新开一个文件夹,在这里运行命令去查询plop
安装的版本:
bash
plop -v
4.0.0
既然这个命令没报错,说明plop
这个是全局可用的,查找node的安装目录AppData\Roaming\npm
,果然发现了这个命令。因为我的plop用npm install =g plop
安装过,所以不会报错,但是别人没有全局安装。
问题的解决方案之一就是让队友全局安装。
但是我们项目也本地安装了plop,难道这个是不生效的吗?
我在我的本地项目中查询plop安装的版本:
bash
plop -v
CLI version 4.0.0
Local version 4.0.1
发现有一个Local version 4.0.1
,这个就是我们在执行npm install plop -D
的时候安装的(package-lock.json中能看出来)。
无独有偶,我发现项目的启动命令npm run dev
和vite
也是有同样的问题:
vbnet
dev: 'vite'
npm run dev
实际上是执行了vite
,为什么我们要这样写?运行项目的直接输入vite
不是更省力吗?
如果我直接输入vite,也会有报错,提示命令不存在。
npm run dev
确实执行了vite
,但是这里的vite
命令,并不是直接在全局环境下去找,而是在node_modules
的bin
目录下去寻找执行语句,bin
目录又指向了node_modules/vite/bin
。
过程梳理
-
在发布npm包的时候,
package.json
中可以定义bin,指向一个执行文件,在执行npm install
的时候,自动在node_modules
的bin
目录下新增可执行文件。 -
在执行
npm run XXX
的时候,首先是去node_modules
的bin
目录下寻找是否有该命令,如果有的话,根据该命令,定位到执行文件,然后往下执行;如果找不到,就去node的全局环境找命令;再找不到,就会报错。
最终处理方案
package.json中新增一个scripts,
json
{
"scripts": {
"create": "plop",
}
}
使用方法:
shell
npm run create [XXX] [XXX]
这样就不用全局安装plop了。
自己发布npm包时如何配置命令?
需要在package.json
中定义bin
。