Skip to content

概要

bash
npm exec -- <pkg>[@<version>] [args...]
npm exec --package=<pkg>[@<version>] -- <cmd> [args...]
npm exec -c '<cmd> [args...]'
npm exec --package=foo -c '<cmd> [args...]'

npx <pkg>[@<specifier>] [args...]
npx -p <pkg>[@<specifier>] <cmd> [args...]
npx -c '<cmd> [args...]'
npx -p <pkg>[@<specifier>] -c '<cmd> [args...]'

alias: npm x, npx

--package=<pkg> (may be specified multiple times)
-p is a shorthand for --package only when using npx executable
-c <cmd> --call=<cmd> (may not be mixed with positional arguments)
npm exec -- <pkg>[@<version>] [args...]
npm exec --package=<pkg>[@<version>] -- <cmd> [args...]
npm exec -c '<cmd> [args...]'
npm exec --package=foo -c '<cmd> [args...]'

npx <pkg>[@<specifier>] [args...]
npx -p <pkg>[@<specifier>] <cmd> [args...]
npx -c '<cmd> [args...]'
npx -p <pkg>[@<specifier>] -c '<cmd> [args...]'

alias: npm x, npx

--package=<pkg> (may be specified multiple times)
-p is a shorthand for --package only when using npx executable
-c <cmd> --call=<cmd> (may not be mixed with positional arguments)

描述

此命令允许您从 npm 包(本地安装或远程获取)运行任意命令,其上下文与通过npm run.

该选项指定的任何包都--package将在执行的命令中提供PATH,以及任何本地安装的包可执行文件。--package可以多次指定该选项,以便在所有指定的包都可用的环境中执行提供的命令。

如果本地项目依赖项中不存在任何请求的包,则它们将安装到 npm 缓存中的文件夹中,该文件夹将添加到PATH执行过程中的环境变量中。打印提示(可以通过提供 或 来抑制--yes--no

不带说明符提供的包名称将与本地项目中存在的任何版本相匹配。仅当带有说明符的包名称与本地依赖项具有完全相同的名称和版本时,才会被视为匹配。

如果未提供-c--call选项,则使用位置参数来生成命令字符串。如果未--package提供选项,则 npm 将尝试根据以下启发式从作为第一个位置参数提供的包说明符确定可执行文件名称:

  • bin如果包的字段中有单个条目package.json,或者所有条目都是同一命令的别名,则将使用该命令。
  • 如果包有多个bin条目,并且其中之一与name字段的无范围部分匹配,则将使用该命令。
  • 如果这没有导致恰好一个选项(或者因为没有 bin 条目,或者没有一个name与包的条目匹配),则npm exec退出并出现错误。

要运行指定二进制文件以外的二进制文件,请指定一个或多个--package选项,这将阻止 npm 从第一个命令参数推断包。

npx-vs-npm-exec

当通过npx二进制文件运行时,所有标志和选项必须在任何位置参数之前设置。当通过 运行时npm exec,双连字符--标志可用于抑制 npm 对应发送到执行命令的开关和选项的解析。

例如:

$ npx foo@latest bar --package=@npmcli/foo
$ npx foo@latest bar --package=@npmcli/foo

在这种情况下,npm 将解析foo包名称,并运行以下命令:

$ foo bar --package=@npmcli/foo
$ foo bar --package=@npmcli/foo

由于--package选项位于位置参数之后,因此它被视为执行命令的参数。

相反,由于 npm 的参数解析逻辑,运行此命令是不同的:

$ npm exec foo@latest bar --package=@npmcli/foo
$ npm exec foo@latest bar --package=@npmcli/foo

--package在这种情况下,npm 将首先解析选项,解析@npmcli/foo包。然后,它将在该上下文中执行以下命令:

$ foo@latest bar
$ foo@latest bar

建议使用双连字符来明确告诉 npm 停止解析命令行选项和开关。因此,以下命令与上面的命令等效npx

$ npm exec -- foo@latest bar --package=@npmcli/foo
$ npm exec -- foo@latest bar --package=@npmcli/foo

examples

tap使用提供的参数运行本地依赖项中的版本:

bash
$ npm exec --tap --bail test/foo.js 
$ npx tap --bail test/foo.js
$ npm exec --tap --bail test/foo.js 
$ npx tap --bail test/foo.js

通过指定选项来运行名称与包名称匹配的命令以外的命令--package

bash
$ npm exec --package = foo -- bar --bar-argument  
# ~ 或 ~
$ npx --package = foo bar --bar-argument
$ npm exec --package = foo -- bar --bar-argument  
# ~ 或 ~
$ npx --package = foo bar --bar-argument

在当前项目的上下文中运行任意 shell 脚本:

bash
$ npm x -c 'eslint && say "hooray, lint passed"'
$ npx -c 'eslint && say "hooray, lint passed"'
$ npm x -c 'eslint && say "hooray, lint passed"'
$ npx -c 'eslint && say "hooray, lint passed"'

compatibility-with-older-npx-versions

npx二进制文件在 npm v7.0.0 中被重写,并且独立npx包当时已被弃用。npx使用该npm exec命令而不是单独的参数解析器和安装过程,并提供一些功能来保持与其在先前版本中接受的参数的向后兼容性。

这导致其功能发生一些变化:

  • npm可以提供任何配置值。
  • 为了防止因错误输入软件包名称而导致安全和用户体验问题,npx请在安装任何内容之前进行提示。使用-y--yes选项禁止出现此提示。
  • --no-install选项已弃用,并将转换为--no.
  • Shell 后备功能已被删除,因为这是不可取的。
  • -p参数是 in npm 的简写--parseable,但也是--packagein npx 的简写。这是被维护的,但仅限于npx可执行文件。
  • --ignore-existing选项已删除。本地安装的 bin 始终存在于执行的进程中PATH
  • --npm选项已删除。npx将始终使用npm它附带的。
  • --node-arg选项-n被删除。
  • --always-spawn选项是多余的,因此被删除。
  • --shell选项被替换为--script-shell,但保留在npx可执行文件中以实现向后兼容性。