npx

运行来自本地或远程 npm 包的命令

选择 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 从第一个命令参数推断包。

npxnpm 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 可执行文件中仍然保留。

另请参阅