npm 執(zhí)行 exec

2021-10-29 10:49 更新

從本地或遠(yuǎn)程 npm 包運(yùn)行命令

概述

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)

描述

此命令允許你在與通過(guò)npm run.

不帶位置參數(shù)或 運(yùn)行--call,這允許你在運(yùn)行package.json腳本的同一類 shell 環(huán)境中以交互方式運(yùn)行命令?。當(dāng)標(biāo)準(zhǔn)輸入是 TTY 時(shí),CI 環(huán)境中不支持交互模式,以防止掛起。

--package選項(xiàng)指定的任何包都將PATH在執(zhí)行的命令中提供,以及任何本地安裝的包可執(zhí)行文件。--package可以多次指定該選項(xiàng),以在所有指定包都可用的環(huán)境中執(zhí)行提供的命令。

如果本地項(xiàng)目依賴項(xiàng)中不存在任何請(qǐng)求的包,則將它們安裝到 npm 緩存中的文件夾中,該文件夾將添加到PATH執(zhí)行過(guò)程中的環(huán)境變量中。將打印提示(可以通過(guò)提供--yes--no來(lái)抑制)。

不帶說(shuō)明符的包名將與本地項(xiàng)目中存在的任何版本匹配。如果帶有說(shuō)明符的包名稱與本地依賴項(xiàng)具有完全相同的名稱和版本,則它們才會(huì)被視為匹配項(xiàng)。

如果沒(méi)有提供-c--call選項(xiàng),則使用位置參數(shù)來(lái)生成命令字符串。如果--package未提供任何選項(xiàng),則 npm 將嘗試根據(jù)以下啟發(fā)式從作為第一個(gè)位置參數(shù)提供的包說(shuō)明符中確定可執(zhí)行文件名稱:

  • 如果包在package.json中的bin字段中只有一個(gè)條目,或者如果所有條目都是同一命令的別名,則將使用該命令。
  • 如果包有多個(gè)bin條目,并且其中一個(gè)與name字段的無(wú)作用域部分匹配,則將使用該命令。 如果這不會(huì)導(dǎo)致只有一個(gè)選項(xiàng)(因?yàn)闆](méi)有 bin 條目,或者它們都不匹配name包的 ),則?npm exec退出并出現(xiàn)錯(cuò)誤。

要運(yùn)行指定二進(jìn)制文件以外的二進(jìn)制文件,請(qǐng)指定一個(gè)或多個(gè)--package選項(xiàng),這將阻止 npm 從第一個(gè)命令參數(shù)推斷包。

npx 對(duì)比 npm exec

當(dāng)通過(guò)npx二進(jìn)制運(yùn)行時(shí),所有標(biāo)志和選項(xiàng)必須在任何位置參數(shù)之前設(shè)置。當(dāng)運(yùn)行 via 時(shí)npm exec,--?可以使用雙連字符標(biāo)志來(lái)抑制 npm 對(duì)應(yīng)該發(fā)送到執(zhí)行命令的開關(guān)和選項(xiàng)的解析。

例如:

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

在這種情況下,npm 將解析foo包名稱,并運(yùn)行以下命令:

$ foo bar --package=@npmcli/foo

由于--package選項(xiàng)來(lái)之后的位置參數(shù),它被視為一個(gè)參數(shù)傳遞給執(zhí)行命令。 相比之下,由于 npm 的參數(shù)解析邏輯,運(yùn)行這個(gè)命令是不同的:

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

在這種情況下,npm 將--package首先解析選項(xiàng),解析?@npmcli/foo包。然后,它將在該上下文中執(zhí)行以下命令:

$ foo@latest bar

建議使用雙連字符來(lái)明確告訴 npm 停止解析命令行選項(xiàng)和開關(guān)。因此,以下命令等效于npx上面的命令:

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

配置

package 包

  • 默認(rèn)值:
  • 類型:String(可多次設(shè)置)

要為npm exec安裝的軟件包

call

  • 默認(rèn)值:""
  • 類型:String

npm exec、npx的可選配套選項(xiàng),允許指定自定義命令與已安裝的軟件包一起運(yùn)行。

npm exec --package yo --package generator-node --call "yo node"

workspace 工作區(qū)

  • 默認(rèn):
  • 類型:String(可多次設(shè)置)

允許在當(dāng)前項(xiàng)目的已配置工作區(qū)的上下文中運(yùn)行命令,同時(shí)通過(guò)僅運(yùn)行此配置選項(xiàng)定義的工作區(qū)進(jìn)行過(guò)濾。

workspace配置的有效值為:

  • 工作區(qū)名稱
  • 工作區(qū)目錄的路徑
  • 父工作區(qū)目錄的路徑(將導(dǎo)致選擇所有嵌套工作區(qū))

npm init命令設(shè)置時(shí),可以將其設(shè)置為尚不存在的工作區(qū)的文件夾,以創(chuàng)建該文件夾并將其設(shè)置為項(xiàng)目中的全新工作區(qū)。

此值不會(huì)導(dǎo)出到子進(jìn)程的環(huán)境中。

workspaces 工作區(qū)

  • 默認(rèn)值:false
  • 類型:Boolean

啟用在所有已配置工作區(qū)的上下文中運(yùn)行命令。

此值不會(huì)導(dǎo)出到子進(jìn)程的環(huán)境中。

例子

tap使用提供的參數(shù)運(yùn)行本地依賴項(xiàng)中的版本:

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

通過(guò)指定選項(xiàng)運(yùn)行名稱與包名稱匹配的命令以外的命令--package

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

在當(dāng)前項(xiàng)目的上下文中運(yùn)行任意 shell 腳本:

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

工作區(qū)支持

你可以使用workspaceworkspacesconfigs 在指定工作區(qū)的上下文中從 npm 包(本地安裝或遠(yuǎn)程獲?。┻\(yùn)行任意命令。如果沒(méi)有提供位置參數(shù)或--call選項(xiàng),它將在這些配置的工作區(qū)中的每一個(gè)的上下文中一次打開一個(gè)交互式子shell。

給定一個(gè)配置了工作區(qū)的項(xiàng)目,例如:

.
+-- package.json
`-- 包
   +-- 一個(gè)
   | `--package.json
   +-- b
   | `--package.json
   `--c
       `--package.json

假設(shè)在根級(jí)別package.json文件中正確設(shè)置了工作區(qū)配置?。例如:

{
    “工作區(qū)”:[“./packages/*”]
}

使用workspaces配置選項(xiàng)時(shí),你可以在每個(gè)已配置工作區(qū)的上下文中從包中執(zhí)行任意命令,在此示例中,我們使用eslint來(lái) lint 在每個(gè)工作區(qū)文件夾中找到的任何 js 文件:

npm exec --ws -- eslint ./*.js

過(guò)濾工作區(qū)

還可以使用workspace配置以及名稱或目錄路徑在單個(gè)工作區(qū)中執(zhí)行命令?:

npm exec --workspace=a -- eslint ./*.js

workspace配置還可以以運(yùn)行在多個(gè)工作區(qū)的背景下,特定的腳本中指定多次。workspace在命令行中為配置定義值時(shí),也可以-w用作簡(jiǎn)寫,例如:

npm exec -wa -wb -- eslint ./*.js

最后一條命令將eslint./packages/a和?./packages/b文件夾中運(yùn)行該命令。

與較舊的 npx 版本的兼容性

npx二進(jìn)制文件重寫NPM 7.0.0,以及獨(dú)立的npx?包當(dāng)時(shí)棄用。?npx使用該npm exec?命令而不是單獨(dú)的參數(shù)解析器和安裝過(guò)程,具有一些可供性以保持與它在以前版本中接受的參數(shù)的向后兼容性。

這導(dǎo)致其功能發(fā)生了一些變化:

  • npm可以提供任何配置值。
  • 為防止因錯(cuò)誤輸入包名稱而導(dǎo)致安全和用戶體驗(yàn)問(wèn)題,請(qǐng)npx在安裝任何內(nèi)容之前進(jìn)行提示。使用-y--yes選項(xiàng)取消此提示。
  • --no-install選項(xiàng)已棄用,將轉(zhuǎn)換為--no.外殼回退功能被刪除,因?yàn)樗遣豢扇〉摹?/li>
  • -p參數(shù)是--parseablein npm的簡(jiǎn)寫,但是 in npx 的簡(jiǎn)寫--package。這是維護(hù)的,但僅適用于npx?可執(zhí)行文件。
  • --ignore-existing選項(xiàng)已刪除。本地安裝的 bin 始終存在于執(zhí)行的進(jìn)程中PATH。
  • --npm選項(xiàng)已刪除。?npx將始終使用npm它附帶的。
  • --node-arg-n選項(xiàng)都被刪除。
  • --always-spawn選項(xiàng)是多余的,因此被刪除。
  • --shell選項(xiàng)被替換為--script-shell,但保留在npx可執(zhí)行文件中以實(shí)現(xiàn)向后兼容性。

關(guān)于緩存的說(shuō)明

npm cli 在使用指定的包名稱時(shí)利用其內(nèi)部包緩存。你可以使用以下內(nèi)容來(lái)更改 cli 使用此緩存的方式和時(shí)間。有關(guān)npm cache緩存如何工作的更多信息,請(qǐng)參閱。

首選在線

強(qiáng)制對(duì)包進(jìn)行陳舊性檢查,使 cli 立即查找更新,即使包已經(jīng)在緩存中。

首選離線

繞過(guò)包的陳舊檢查。仍然會(huì)從服務(wù)器請(qǐng)求丟失的數(shù)據(jù)。要強(qiáng)制完全離線模式,請(qǐng)使用offline.

離線

強(qiáng)制完全離線模式。任何未在本地緩存的包都會(huì)導(dǎo)致錯(cuò)誤。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)