# 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 可执行文件中保持向后兼容性。
Last Updated: 4/25/2023, 9:49:29 AM