目录
npx
选择 CLI 版本
目录
概要
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
字段的非作用域部分匹配,则将使用该命令。 - 如果这不会产生 exactly one 选项(因为没有 bin 条目,或者没有一个条目与包的
name
匹配),则npm exec
退出并显示错误。
要运行 _其他_ 名为二进制文件以外的二进制文件,请指定一个或多个 --package
选项,这将阻止 npm 从第一个命令参数推断包。
npx
与 npm exec
通过 npx
二进制文件运行时,所有标志和选项 _必须_ 设置在任何位置参数之前。通过 npm exec
运行时,可以使用双连字符 --
标志来抑制 npm 对应发送到执行命令的开关和选项的解析。
例如
$ npx foo@latest bar --package=@npmcli/foo
在这种情况下,npm 将解析 foo
包名,并运行以下命令
$ foo bar --package=@npmcli/foo
由于 --package
选项位于位置参数 _之后_ ,因此它被视为执行命令的参数。
相反,由于 npm 的参数解析逻辑,运行此命令有所不同
$ npm exec foo@latest bar --package=@npmcli/foo
在这种情况下,npm 将首先解析 --package
选项,解析 @npmcli/foo
包。然后,它将在该上下文中执行以下命令
$ foo@latest bar
建议使用双连字符字符明确告诉 npm 停止解析命令行选项和开关。因此,以下命令将等同于上面的 npx
命令
$ npm exec -- foo@latest bar --package=@npmcli/foo
示例
运行本地依赖项中的 tap
版本,并提供给定的参数
$ npm exec -- tap --bail test/foo.js$ npx tap --bail test/foo.js
通过指定 --package
选项,运行 _其他_ 与包名匹配的命令以外的命令
$ npm exec --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 中重写,并且 standalone npx
包在那个时候被弃用。 npx
使用 npm exec
命令而不是单独的参数解析器和安装过程,并提供了一些便利,以保持与以前版本中接受的参数向后兼容。
这导致了一些功能变化
- 可以提供任何
npm
配置值。 - 为了防止拼错包名带来的安全和用户体验问题,
npx
在安装任何东西之前都会提示。使用-y
或--yes
选项来抑制此提示。 --no-install
选项已弃用,并将转换为--no
。- 已移除 shell 回退功能,因为不建议使用。
- 在 npm 中,
-p
参数是--parseable
的简写,但在 npx 中是--package
的简写。这将保持不变,但仅适用于npx
可执行文件。 - 已移除
--ignore-existing
选项。本地安装的二进制文件始终存在于执行进程的PATH
中。 - 已移除
--npm
选项。npx
将始终使用它所附带的npm
。 - 已移除
--node-arg
和-n
选项。请改用NODE_OPTIONS
:例如,NODE_OPTIONS="--trace-warnings --trace-exit" npx foo --random=true
- 已移除
--always-spawn
选项,因为它冗余。 - 已将
--shell
选项替换为--script-shell
,但为了向后兼容性,它在npx
可执行文件中仍然保留。