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 运行类似的上下文中从 npm 包(本地安装或远程获取)运行任意命令。

在没有位置参数或 --call 的情况下运行,这允许您在与 package.json 脚本运行相同的 shell 环境中交互地运行命令。当标准输入是 TTY 时,CI 环境中不支持交互模式,以防止挂起。

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

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

3hhq550SS2g4207ZTAbYPTI2vJqLEdck/3yoDjf7R21yf6EobwU576iL0Mq8edZRCwn20sY4aSCGDipXTjWxyHHoi44hUL0PR3ZYuvb9B19xpMYEGFeK1cduefTh3z4JWUfqn8AVQQz/QTOgPYtfrv5UieccosW1rBkfSWIRFYB83QU56KJZfbTJ7XZDpceeWW4hBoEFNR5GJTC+umTFPvYLcuCGNFjELHsTbEoA19WAtwx2z4ksJEEg2pmQKuBYcG/x1p53sO0Thny/qf4QfQ==

wPv+49KSmgMUq2b2Puhslgnx1UigRcdym7lKS+BV3VfMXPqxd5wxgTAnPO2OaV0sc21mbbBb9y9g4L0Z+s3cH6WI2Jn48uEflDUPs6UrBdPVGNbFRuB7JMZa8Ft2qAGqtnIHDw1KGYYkF2zF3rPDIWuhf+bcPmvPYQSZTr86xhZYfCFX2WJzqPj/MzYjuF9atALOtrVfJpymFfbQYPjKDu3JduLy3Ya2INfBWst9wrenueW6iqwdI/SBNwN8ZZjntboRWVwQb1pJzKTF5MpIIA7aoKGzPo9TqLuIIqDBeioH1b8m1CP2hKjmZ3A0nZVtB+wFxcsyEvlPPIuFBIWO/iK/GR4LyaGeYo1UHDpvWlVEs8pBtpfAjd+XbF1WsBOZ

    znA7B4t7b6lOp3tcQKFwOalEa5z3mn5wzHGh339s0nf6hWtKD5CZG9yqQH/2tKFy7EcFomlZPSGJsWmw0Wc9/LNt3dzXVq0b+fxCRn27u7E9BbcT0iEzJoPu8qtUipDX1TAOyhuTXpBVql1SrToNXR7SjJi/0iRiLrY68DWjo4+qMcWEaRTJtzngLR2mGjlgUxsKyYwQH+ddX73zrMfLpR6LT/b50cRJUtl/QZELVreZnthrdHUvfqSaEdepHOE5w0e+SFuKnRXoUe0E0dZN0jZ/Uf8M0M3bIyM596kifuZ2qbQOaOq7BkQ1KRQq9DrHHym7E9NmJvhg96zCq9RWVJ59OpXU1tNouA3U2+gAApENitSpHAkI23KOJUvQ6keCH4Pz0ZgWjppahnJTpfNQiABSS4wkySV5fS6wNiT/r/gBh1q53ldXiHVDGdYqJamu/n1/bKdQl4IsD2LDU7cd9tkaIjeXKD5YXay04jmBzaN0N8F6afiS9RiOhxyKGJq88ivx9BKRnqYE1H90m9tE5Ld9JDQKpE8ZcYcYq1znhsk1sHwRSxjLNnCRBlnuPAbkiqtWCGFwyVnW8JXVHIz2mFdpebOEZWJVUpxZKLFi6Zhr6U0q1hEh4U8uOmeESx+0vNDxvNS8hqSti4FkllxB4DzF482PmhCi014KaZ2mjmU=

rLbUXk43SXbViBKfHirDbcdgUvOVlJ/H39B59g5s6kYcdP2Eq3HnpnZ+P3hM/dDHLiTpriLZFzTw1GgAMFGRU19JJVBbbp616P7Ah67zbftYwSYg63xMRB5XuNyzTxQPZV9wnDcYLUKU/m46rhr5FMwaiD9g2nXQGUXCtju2zdle2bTC9f2ebFB65l1rqGF2bsO76ovmmkuM4enFMxjkdNjXjM5dWnxhL7DDRa+MM0A=

npx 与 npm exec

Tbo1FxujMW7SFOzfl7Ia/FkPBfPTnUcsz5o0zA8QqSURZs+EdlzGL7xqTkE0xbWdHSTC0KcwlLMzexAjERqX5EJQ1rrctA4fbBIQwJFgc4u68i+n98VHZ6Q0VkfnRRk9iThSxUmwZw4rK6d1zzt9b+HFghv+40eYYNf/nB7CDZxUVXfeiLYIWK3nHmDR8beNiBp3n+uU8ClsO/4d9U6lXbAyTAZxR3cq6rEapONd41QfUt356Daizg44ShzSlRlL7k4tzni0LScVxZlWrJUq8GrvMqRKYXifTmnF7KmkFr3viKVFTjxmb4ym0zFUpFuBEm/2YCNAJFfw12RaVDzBkrwKMZ3ZR/rTmxrHqvIPzpg=

60UMxSoViWyh6aKkPoRIiQ==

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

p+d6vi4GzaZfsf+EeaMsFpTk6/JjMMdBoPkJHyqut/wWTT2HJYByxfXss6PhRng9CYgCx+fBsNp9IXE9qGDzYnC5KYTpSpYTcl/N0YrHed5CzAqknrr0j/ppJ79gqS8G

$ foo bar --package=@npmcli/foo

ovcnUHyYMZpehRGtJswqk7ZoSEfQALtC3tCNHv941+BFI7/I+g0Q/RgxRalK+mccDpMJ87CyS51w5nYGkl+tHqbRpCSwd2Vqw4vtDDhGpSBJiTWiv13B6fronWlSs4b+VMQi6/hUYats5c0DjmA5zg==

ckQGlBEFJFcFvF7vVMwIyrD96EBsAwpqvLraRCzizicS/YM0mdKddSA1uomSxLlpO+JncKElfqSMT+CfVjCOK6QZpStqBdpT6/zuDopmweu+BHu7Bgd10lAIP5/Ht8Uz

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

p+d6vi4GzaZfsf+EeaMsFttWXMAEIv6nJKXg9v3KVts3LRcHwQSUTm4Jgv1+9KyA8LAY3k1vDZA0CC59syiIRrPy/iu3I2GjhQP6R2OtJYhy+/Mj/+o+9hR9vQjxLSw4Ll07SB6DN1yck0bSK6Gzv23ZpUASAMOhXAz+135kgTkurE1llCvl2BzFhkx4Y7XbGl0vkK8Uj0oghj0t1FmWS75Omd1089d/f83Ht8RT33w=

$ foo@latest bar

gShDjD4fftuJinEmZ2iHe/a7AgxAL/I+sc7x39mKEQ8wXQPChT2I2f7MUDv3dmc11quOV3cMXhmdk0PY31XCOB+7uRtQZuulT72WegAfOH0SX8dfRTSTSHkjv6jFtIyk6++eUtweaKgcp8uoWDDSi70DNZSoV4fr8g/KaYrLLNiayNAHGnbdWkupeNi94qKUKdJ7l+hQ0BImvurqFh0Pfg==

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

配置

package

    Jo9YyMATQgc1FiySMtnVB4YMB8db7UZN5DIyxKHPry2OmSdp+K3HOJ3BdgWQJYt6tCGvlPdqm/XRnvUydHufmqhIn3jdcfH1Kn7xmtkOnok=

RVlJ4hnokhKlYTHN/PcE1xnDgn2uCoKlK3dBYNIFCCJjWrinSnpxhrmaDCnubHh7pWpCrVeoocD8/1p5uGaHIor6pHc32t26H2GJBL05MhUzu9yW7wruwTusHO4zxEp5

call

    Jo9YyMATQgc1FiySMtnVB7/vBARZbW1HBXmpewsw+joPANSsNm5NC54aazVGDrIpjoC3x2k6kPBcnQt9+C50xw==

DE0rPfZFzTLCbpKFE8Gwd1EWSh+0mianV9ncL4sFtqH8viDPohJzH0NItaWCuWJmBNwSr+OZN5CtrFaMHv56JguxA7Wm692MqseFbqWur5Mx+MdAxjzF5AK9eIrvD/CCAEh+MavJ8rH749j+ekZJxwY6qttSo1jNl3ZFbzrlVEg=

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

workspace

    Jo9YyMATQgc1FiySMtnVB4YMB8db7UZN5DIyxKHPry2OmSdp+K3HOJ3BdgWQJYt6tCGvlPdqm/XRnvUydHufmqhIn3jdcfH1Kn7xmtkOnok=

mxwwxmyxfRa/NX5mOTOp/a4pbtoEncEIbcu/bItobyuIXQcms5LhzXDAPZgtFVUAWQV7iHbgNij2yBtG7f0VhSoywJSPEjoJHIrci/HPLjmtfh4imWfDC5UHFL2GHZY0ss32EUEo730we1vYXIcZtblB9YA4BtEoHbMRw22RUeP65aDRMLidjPpjUhvqEYsN

BoYudhX6P4R1Soh/jgAruWdla2jYU6xac7my5c5CKT3I/QY84Lv+gbKiqsys346a

    cU7jI/u+nZ6FiyGSMF84fwc8uqBPenfpfpU5EDAssdJsRYv0Wpcmk6KnorwqXaIjJcHDqpXKV9FK+ctwsWVS27n+gIzaTMKuPizZgazJZ/OPnN3hqRWu4L51vlfOeq/k0sxf1WvZc4irgeB3jL/1nA7bjnS2XbNesIX36F7SYZFmY2p39Yw7TwLBiTK0Hf+P

mKbWXqo2lu8puKuCCjmm9rniCOc2WSLx/6zNtglNO9gyedHQW0QdgZMW6N2+83Cjca/SRDRkaKTkrtil7rw25g9k8gHzMWfIAIj4lYR+5RNcoZkshh2AU9mlj+vxp8TeDoFyaE4etGuw1o4MdUyqWpG5jd1h/0jUe1RFdvV6ZTPs0hXkTMcY4VaEJvnl621A1jc6eL8DM0SvB65xAHOlST2XSAaLwaKmtRO8+PXa7WGBsPD20o7RZOcEy7/Fc8kp

IU7eZdovqx6/3kRLl5j3d7MFt40URbof12xB7spKp0SC2tLUFWMo6NanHWCAWavF

workspaces

    Jo9YyMATQgc1FiySMtnVB2r22JOfbzP94ImRd9QBcoXzhu/uEoooTHYnsxQFqN17radjgV+EY9MnXotENoKrsA==

8+WMnE3QB1g/gMm40p44HM63cuIwZb5z9ZeUpZL35ecCM9JDVQHRcqnYG93W6v/8ednF2Tr7RJW3jLzE+uUK3w==

IU7eZdovqx6/3kRLl5j3d7MFt40URbof12xB7spKp0SC2tLUFWMo6NanHWCAWavF

示例

v9EaPXqTxdth1UuiiSLMAeP66FBOuSJNer4VRt68ZV4diesMNBPA9Pgit+9/gCxPmnDHaMvYGRQS1BI9gpT3MI10GuMPlImUev1pEbNFaFk=

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

krsUoyRkamxzVQW17LiHnLoBrcOuNnxFwez/8ABCzNVO+DUHhSpYXBwVzlNYS4g101dGZUfRY3EyxRNeIvHzJsKw10UjCFEU9OdKDVmVecO4Xq+9YXgLdaBlBKxR6ldSxQVYFN4aAbuoG3T1CQwcMw==

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

zaqdNZDAy6oksh7yWruLRj9RjBKSwMwwZoXzKPRzj3vmZ8T1MNqoghVqMJyUw+tAVYuKSLeTMMQeYM4nEuWvRw==

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

工作区支持

FasCj1v73/gxnVHUhlfn4STBlQt1XqHFs1QIssUFmRx+jDON7GHTBD7E9++JNX4Jwu0PuOz5eKY4x6dy9ABmKEnbyRaLscLObC5rXgEQAXKltZ4ag9JPRHjMXDgSyN7HwyZaS5L7B13AkKqNInfiAEqdzjwfuB3reRaNkn6q8U4Y0Guydnm12lYleBd3e1r0vaK54Jx1/GH6Sw9cRcn3PlVmAry6HABfn19T7zbSkyDEIENG4iN5S7We+NjH7M58/Xs1PX+E6UcBEAu9O8Axib2x3XeYoGhrubbwNeRZIVSorMHSmoyLWES4q5f/eVr+gXt7l/uklBrSnYPIqa7e7Eeba9W1XDeDxO0i2GBuPfa1WG3XOPAAn7neiV+IDeVUNqQz9hzny0DXqXWwyj2leAO2K/gZDk25l5wPZ5KyFHSltpv9WGZiLCqtbPtWY7uxeSxjVij/7ZJLZ4pkUbgchA==

f98grulwphEQsGOCpA5UfmfxBzftLLYb8ua6hk+ucXMdKJLYSem71WIudEiF1rR4TKBCUomPqN1LTKgDWVTrcQ==

.
+-- package.json
`-- packages
   +-- a
   |   `-- package.json
   +-- b
   |   `-- package.json
   `-- c
       `-- package.json

49ZMb7EMFFFutbU4Lsdg1qEAv/zFrbMB2sVqmQ5i+f/8nWJdqcvGX/C7/1tPfu1il6CivSHfcsNI4UBgDgcJFHZw7rneAIvD4K43147PyY2bxuSSvOAnFgB7Vj9+PIlMUe/aPd4IQc+7jH5PGG/BuA==

{
    "workspaces": [ "./packages/*" ]
}

TaG03yt88Q61hLdQbxYOLY7BQyDsvjiY3XCcXtawoNo/52ejx8gIO9SIP/1cIh8RczfjY+WCx/anphwa5NP7/USu4Qtcvn2QF42+RlkJs1o2m1Yf14VABPQshjYvQGOwNy8csRt+uxNOXBXyGCBOiy+mU7WJzz/IKcKJ7SF3S0eftLvSIqidFDgUjy6wZgFLYoOSos8jRqUNxQOM1GSDHdB3MChN3mPsflxOFjqULaSZC1El8w6o0MM6SHQGsfvRbu0NztSkxMz/U6gq+rW+afVbRxLXBlfXBHSbe/vlVcYh0SrwJlt+xYo1I1Ue+AXh2cUNAWwYUJAZN9lNIwg9AA==

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

过滤工作区

rsRgrhEnF+ndrMtG7Z+g+QnwASvrRdx0LPs/n66XWH4ssfJkT7qIGKExqz4V0N6LdwP4f1ee2u8meLSFm8vi+4vnG4ax53FUf5W2BM60wQEE68ceb68PxOrrzyrncmX07OweYhsMvw+uCSPuVVzxTA==

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

X4NDJoKQmkczl3DVmf7dIR+ICKEGx9dyn0uxLRPX5Hii5l29JyBS7De4Vj7jkggT665x9f3MR+Y1Z3gc45iBwGaLUKKNr+FQCyuG+o9Ktjy7kbbRx0MS1jeEGXVgDks6c9+VNqzkmMRhs+SY+xMyb482emTJeaCoufvt82YJv1890vN90QJ2xGBjhEZ4GPK/fxhqf28KRDTWEOm1xnbAeH+kyeemU7KB3qY8sSEIPRV7d34QZYpEVT1ORV1GHOI/vhCVKlDbHJ8fUieq+kNLjsfT+OwDwYy3VaP2rEJRMxXBZTRSDawUdYhvpI5PdIft

npm exec -w a -w b -- eslint ./*.js

IZHcgIaRhEDPiWpNKV5r9IxF4+037O7vlXTOjiGCvBxLhVEL/o29nVTrKTF3ZcQtytEIpSbxc7I3VvHLEVl8e5v9HlObyFj3oP0L4Ni1xRNJH781RPpUXX9i9EifiS/7o6gVLndJe1tKK/mI/UeFm/mYe5gBx5JHODYc7yO1gnTDMCJFV0x3M5mj21s9d1Fl

与旧 npx 版本的兼容性

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

关于缓存的说明

Xm+Z7DIpwHQDYuTkxGWsutD5KN/fHCs6Tcb3PZOl5OhXxoWcggNqpSoIYUNwx7NEt8TkqL1RA+tSii5TIu6pTM3shH1xU5Zz7FNKngMFrRINNBmgEn1sZpC3iseXf2qUy+suEd/ikhwMqas/TdepR2y7BHU5iDd2ptzQxY8XvInx+j9OsITRYX+c/v3MpI5fN12AivnzBalkG+wFnnl5OK+hODlKVMfPvmMawfaeKTMFC9HGrMSN4iZCuvkTuSaxZmBI6ppNOdtp+/dzi0orefXJ1uASoMNMYsflcpefyBIAAQbTPBxHI9LKtGWxAtHW8xgrUGdfUFymZBNKKX7ws0k1Dy9WvpI31e9SQR6PucA=

prefer-online

CsT/+k0BSVSdM/TXRs5r/t48cdWblkN+s7guOedyi9T2tl7FpwMavC+10u+glpnst7tv4dTctXnp9fGfVU2nQQJE93OiZ/AJaiVPQlLFVIe2J6X0zXMOkSHZxM/Uj6ad

prefer-offline

QS+5bE9iJfh7g/kbZWko8axNIzlKVfVRSdeOWUG7UNEtlj4uNmjYERel4iF8cA+ZQ+4a67WoBdDPi4pDegY22YQHCbM0cjwhUzbL61yIp1VoBYPvNrmgKszhg2pG4b1EXNgvnsIUabqP86//Larx6m64kGkp5Ahg99IS3PIWYIRpw5xiCk5Krw2LrfDu19U/

offline

2KEJygjealnQ0Mz2JTLJbWKPN3QRwdcsj6ZO+72bMEyorLeX4iGjyot61tdLCSOg2EHxQ6m71p7sBF1HEDiR3Ze5J/pKIqjxpSnNuWU4tVg=

workspace

    Jo9YyMATQgc1FiySMtnVB4YMB8db7UZN5DIyxKHPry2OmSdp+K3HOJ3BdgWQJYt6tCGvlPdqm/XRnvUydHufmqhIn3jdcfH1Kn7xmtkOnok=

mxwwxmyxfRa/NX5mOTOp/a4pbtoEncEIbcu/bItobyuIXQcms5LhzXDAPZgtFVUAWQV7iHbgNij2yBtG7f0VhSoywJSPEjoJHIrci/HPLjmtfh4imWfDC5UHFL2GHZY0ss32EUEo730we1vYXIcZtblB9YA4BtEoHbMRw22RUeP65aDRMLidjPpjUhvqEYsN

BoYudhX6P4R1Soh/jgAruWdla2jYU6xac7my5c5CKT3I/QY84Lv+gbKiqsys346a

    cU7jI/u+nZ6FiyGSMF84fwc8uqBPenfpfpU5EDAssdJsRYv0Wpcmk6KnorwqXaIjJcHDqpXKV9FK+ctwsWVS27n+gIzaTMKuPizZgazJZ/OPnN3hqRWu4L51vlfOeq/k0sxf1WvZc4irgeB3jL/1nA7bjnS2XbNesIX36F7SYZFmY2p39Yw7TwLBiTK0Hf+P

IU7eZdovqx6/3kRLl5j3d7MFt40URbof12xB7spKp0SC2tLUFWMo6NanHWCAWavF

workspaces

    SZoRjdw0GiNQOAjD/c2lRyoJLTrT7S8VyaGp4HYGGgNr11CGp3vt1lyaLDJlvqdi0nMjWge2gDnMdi2xlzSULCVPHUiUn9Go6XudOlfeXihawACk5amAz9epCy7Xw/ZCPBxJKTVx19sPE/+jgaQ4sA==

zaqdNZDAy6oksh7yWruLRid04UyBNCV+C2p+Sx82oLbf92zBFt8JaQPHfZUChvVpj7FGvsq4lEFhVsfrjrzdj588FbnsccyUpuquAEwoX2Q=