npm 执行 exec
从本地或远程 npm 包运行命令
概述
npm exec -- <pkg>[@<version>] [args...]
npm exec --package=<pkg>[@<version>] -- <cmd> [args...]
npm exec -c '<cmd> [args...]'
npm exec --package=foo -c '<cmd> [args...]'
npm exec [--ws] [-w <workspace-name] [args...]
npx <pkg>[@<specifier>] [args...]
npx -p <pkg>[@<specifier>] <cmd> [args...]
npx -c '<cmd> [args...]'
npx -p <pkg>[@<specifier>] -c '<cmd> [args...]'
Run without --call or positional args to open interactive subshell
alias: npm x, npx
common options:
--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 run
.
不带位置参数或 运行--call
,这允许你在运行package.json
脚本的同一类 shell 环境中以交互方式运行命令 。当标准输入是 TTY 时,CI 环境中不支持交互模式,以防止挂起。
--package
选项指定的任何包都将PATH
在执行的命令中提供,以及任何本地安装的包可执行文件。--package
可以多次指定该选项,以在所有指定包都可用的环境中执行提供的命令。
如果本地项目依赖项中不存在任何请求的包,则将它们安装到 npm 缓存中的文件夹中,该文件夹将添加到PATH
执行过程中的环境变量中。将打印提示(可以通过提供--yes
或--no
来抑制)。
不带说明符的包名将与本地项目中存在的任何版本匹配。如果带有说明符的包名称与本地依赖项具有完全相同的名称和版本,则它们才会被视为匹配项。
如果没有提供-c
或--call
选项,则使用位置参数来生成命令字符串。如果--package
未提供任何选项,则 npm 将尝试根据以下启发式从作为第一个位置参数提供的包说明符中确定可执行文件名称:
- 如果包在
package.json
中的bin
字段中只有一个条目,或者如果所有条目都是同一命令的别名,则将使用该命令。 - 如果包有多个
bin
条目,并且其中一个与name
字段的无作用域部分匹配,则将使用该命令。 如果这不会导致只有一个选项(因为没有 bin 条目,或者它们都不匹配name
包的 ),则npm exec
退出并出现错误。
要运行指定二进制文件以外的二进制文件,请指定一个或多个--package
选项,这将阻止 npm 从第一个命令参数推断包。
npx 对比 npm exec
当通过npx
二进制运行时,所有标志和选项必须在任何位置参数之前设置。当运行 via 时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
配置
package 包
- 默认值:
- 类型:
String
(可多次设置)
要为npm exec
安装的软件包
call
- 默认值:
""
- 类型:
String
npm exec、npx的可选配套选项,允许指定自定义命令与已安装的软件包一起运行。
npm exec --package yo --package generator-node --call "yo node"
workspace 工作区
- 默认:
- 类型:
String
(可多次设置)
允许在当前项目的已配置工作区的上下文中运行命令,同时通过仅运行此配置选项定义的工作区进行过滤。
workspace
配置的有效值为:
- 工作区名称
- 工作区目录的路径
- 父工作区目录的路径(将导致选择所有嵌套工作区)
为npm init
命令设置时,可以将其设置为尚不存在的工作区的文件夹,以创建该文件夹并将其设置为项目中的全新工作区。
此值不会导出到子进程的环境中。
workspaces 工作区
- 默认值:
false
- 类型:
Boolean
启用在所有已配置工作区的上下文中运行命令。
此值不会导出到子进程的环境中。
例子
tap
使用提供的参数运行本地依赖项中的版本:
$ npm exec -- tap --bail test/foo.js
$ npx tap --bail test/foo.js
通过指定选项运行名称与包名称匹配的命令以外的命令--package
:
$ npm exec --package=foo -- bar --bar-argument
## ~ 或 ~
$ npx --package=foo bar --bar-argument
在当前项目的上下文中运行任意 shell 脚本:
$ npm exec -- tap --bail test/foo.js
$ npx tap --bail test/foo.js
工作区支持
你可以使用workspace
或workspaces
configs 在指定工作区的上下文中从 npm 包(本地安装或远程获取)运行任意命令。如果没有提供位置参数或--call
选项,它将在这些配置的工作区中的每一个的上下文中一次打开一个交互式子shell。
给定一个配置了工作区的项目,例如:
.
+-- package.json
`-- 包
+-- 一个
| `--package.json
+-- b
| `--package.json
`--c
`--package.json
假设在根级别package.json
文件中正确设置了工作区配置 。例如:
{
“工作区”:[“./packages/*”]
}
使用workspaces
配置选项时,你可以在每个已配置工作区的上下文中从包中执行任意命令,在此示例中,我们使用eslint来 lint 在每个工作区文件夹中找到的任何 js 文件:
npm exec --ws -- eslint ./*.js
过滤工作区
还可以使用workspace
配置以及名称或目录路径在单个工作区中执行命令 :
npm exec --workspace=a -- eslint ./*.js
该workspace
配置还可以以运行在多个工作区的背景下,特定的脚本中指定多次。workspace
在命令行中为配置定义值时,也可以-w
用作简写,例如:
npm exec -wa -wb -- eslint ./*.js
最后一条命令将eslint
在./packages/a
和 ./packages/b
文件夹中运行该命令。
与较旧的 npx 版本的兼容性
该npx
二进制文件重写NPM 7.0.0,以及独立的npx
包当时弃用。 npx
使用该npm exec
命令而不是单独的参数解析器和安装过程,具有一些可供性以保持与它在以前版本中接受的参数的向后兼容性。
这导致其功能发生了一些变化:
npm
可以提供任何配置值。- 为防止因错误输入包名称而导致安全和用户体验问题,请
npx
在安装任何内容之前进行提示。使用-y
或--yes
选项取消此提示。 --no-install
选项已弃用,将转换为--no
.外壳回退功能被删除,因为它是不可取的。-p
参数是--parseable
in npm的简写,但是 in npx 的简写--package
。这是维护的,但仅适用于npx
可执行文件。--ignore-existing
选项已删除。本地安装的 bin 始终存在于执行的进程中PATH
。--npm
选项已删除。npx
将始终使用npm
它附带的。--node-arg
和-n
选项都被删除。--always-spawn
选项是多余的,因此被删除。--shell
选项被替换为--script-shell
,但保留在npx
可执行文件中以实现向后兼容性。
关于缓存的说明
npm cli 在使用指定的包名称时利用其内部包缓存。你可以使用以下内容来更改 cli 使用此缓存的方式和时间。有关npm cache
缓存如何工作的更多信息,请参阅。
首选在线
强制对包进行陈旧性检查,使 cli 立即查找更新,即使包已经在缓存中。
首选离线
绕过包的陈旧检查。仍然会从服务器请求丢失的数据。要强制完全离线模式,请使用offline
.
离线
强制完全离线模式。任何未在本地缓存的包都会导致错误。
更多建议: