npx <pkgName> 执行的是哪个js文件

80 阅读1分钟

node包有多个bin的时候,npx执行的是哪个bin呢?

我们以 npx test-cli 为例,

一、执行node_modules/.bin/xxx

首先,它会去当前开发目录的node_modules/.bin下去找test-cli的同名可执行文件。项目依赖包里含有bin配置,则会在node_modules/.bin创建可执行文件。

二、执行$PATH/xxx

如果1找不到,则去全局安装的环境变量$PATH里去找同名的可执行文件,全局安装的npm包的bin配置,会在$PATH里创建可执行文件。

执行npm包的主bin

如果都找不到同名的可执行文件,则执行npm包的主bin

什么是npm包的主bin

当 package.json 中 bin字段对象中有多条 key:value 时,key值 和 name字段的 value值 相同时, 命令 key 为 主bin;

{
    "name": "test-cli",
    "bin": {
        "test-cli": "./cli.js",
        "test1": "./cli1.js"
    }
}
// 主bin 为 test-pkg 指向的js文件

当 package.json 中 bin字段对象中只有一条 key:value 时, 此时这一条命令 key 为 主bin;

{ 
    "name": "test-cli", 
    "bin": { 
        "test1": "./cli1.js"
    }
}
// 主bin 为 test1 指向的js文件

当 package.json 中 bin字段 的 value值为一个指向执行文件的路径字符串时,bin即为 主bin;

{ 
    "name": "test-cli", 
    "bin": "./cli.js"
}
// 主bin 为 bin 指向的js文件

当 bin 字段对象中有多个 key:value, 并且没有 key值 等于 package.json 中的 name 字段值时,会按照位置排名选出 主bin 命令;

{
    "name": "test-cli",
    "bin": 
    { 
        "b": "./b.js",
        "a": "./a.js",
    }
}
// 主bin 为 b 指向的js文件