# npx
优先本地包中执行命令
# 概要
npx -- <pkg>[@<version>] [args...]
npx --package=<pkg>[@<version>] -- <cmd> [args...]
npx -c '<cmd> [args...]'
npx --package=foo -c '<cmd> [args...]'
# 描述
这个命令允许你从 npm 包(本地安装的或远程获取的)中运行任意命令,在类似于通过 npm run
运行它的上下文中。
--package
选项指定的任何包都将在所执行命令的PATH中提供,以及任何本地安装的包可执行文件。--package
选项可以指定多次,以便在所有指定的包都可用的环境中执行所提供的命令。
如果任何请求的包不在本地项目依赖项中,那么它们将被安装到 npm 缓存中的一个文件夹中,该文件夹将被添加到执行进程中的 PATH
环境变量中。打印一个提示符(可以通过提供 --yes
或 --no
来抑制该提示符)。
不带说明符的包名将与本地项目中存在的任何版本匹配。带有说明符的包名只有与本地依赖项具有完全相同的名称和版本时才会被认为是匹配的。
如果没有提供 -c
或 --call
选项,则使用位置参数生成命令字符串。如果没有提供 --package
选项,那么 npm 将尝试从作为第一个位置参数提供的包说明符中确定可执行文件名,方法如下:
- 如果包在
package.json
中的bin
字段中有单个条目,或者所有条目都是同一命令的别名,则将使用该命令。 - 如果包有多个 bin 条目,其中一个与
name
字段的未限定部分匹配,则将使用该命令。 - 如果没有一个选项(要么是因为没有 bin 条目,要么它们都不匹配包的
name
),则npx
退出并出现错误。
要运行除指定的二进制文件之外的二进制文件,请指定一个或多个 --package
选项,这将防止 npm 从第一个命令参数推断包。
# npx vs npx
当通过 npx
二进制文件运行时,必须在任何位置参数之前设置所有标志和选项。当通过 npx
运行时,双连字符 --
标志可以用来抑制 npm 对应该发送到被执行命令的开关和选项的解析。
比如:
$ npx foo@latest bar --package=@npmcli/foo
在这种情况下,npm 将解析 foo
包名,并运行以下命令:
$ foo bar --package=@npmcli/foo
由于 --package
选项位于位置参数之后,因此它被视为所执行命令的参数。
相比之下,由于 npm 的参数解析逻辑,运行这个命令是不同的:
$ npx foo@latest bar --package=@npmcli/foo
在这种情况下,npm 将首先解析 --package
选项,解析 @npmcli/foo
包。然后,它将在该上下文中执行以下命令:
$ foo@latest bar
建议使用双连字符来显式地告诉 npm 停止解析命令行选项和开关。因此,下面的命令相当于上面的 npx
命令:
$ npx -- foo@latest bar --package=@npmcli/foo
# 例子
在本地依赖项中运行 tap
版本,使用提供的参数:
$ npx -- tap --bail test/foo.js
$ npx tap --bail test/foo.js
通过指定 --package
选项,执行与包名称不匹配的命令:
$ npx --package=foo -- bar --bar-argument
# ~ or ~
$ npx --package=foo bar --bar-argument
在当前项目的上下文中运行任意 shell 脚本:
$ npm x -c 'eslint && say "hooray, lint passed"'
$ npx -c 'eslint && say "hooray, lint passed"'
# 与旧 npx 版本的兼容性
该 npx
二进制文件在 npm v7.0.0 中被重写,并且当时 npx
不推荐使用独立包。 npx
使用 npx
命令而不是单独的参数解析器和安装过程,并提供一些功能来保持与以前版本中接受的参数的向后兼容性。
# 这导致其功能发生了一些变化:
- 可以提供任何
npm
配置值。 - 为了防止错误输入包名造成的安全和用户体验问题,
npx
在安装任何东西之前都会提示。使用-y
或--yes
选项禁止此提示。 --no-install
选项已弃用,将被转换为--no
。- 删除了 Shell 回退功能,因为这是不可取的。
-p
参数在npm
中是--parseable
的简写,但在npx
中是--package
的简写。这是维护的,但只针对npx
可执行文件。- 删除
--ignore-existing
选项。本地安装的容器总是存在于执行的进程PATH
中。 --npm
选项被移除。npx
将始终使用它附带的npm
。- 删除了
--node-arg
和-n
选项。 --always-spawn
选项是多余的,因此被删除。--shell
选项被替换为--script-shell
,但在 npx 可执行文件中保持向后兼容性。
← npm whoami npm 安装 →