“npm run-script build”和“npm build”的区别是什么?

36

当我运行npm build命令时,会出现以下错误:

npm WARN build `npm build` called with no arguments

那么,npm run-script buildnpm build有什么区别?


文档(https://docs.npmjs.com/cli/run-script)中说:*这是由npm link和npm install调用的管道命令。通常应在安装期间调用它,但如果需要直接运行它,请运行:npm run-script build* - Datz
@Datz 那份文档有误。请参考此PR此问题 - Colm Bhandal
4个回答

17

npm run-script 是执行特定于项目/包的任意命令的方式。检查适用的 package.json 文件,该文件将定义在执行 npm run-script build 命令时发生了什么。它还可能包括运行常见命令(例如 npm run-script test)时发生的情况。

正如您在 文档 中所看到的那样,这个任意命令可以包括参数,您需要参考 package.json 以了解更多信息。

npm build 不是该包的唯一命令,而是随 npm 一起提供的本地命令,您可以在 其文档 中查看。


18
жҲ‘жҖҖз–‘иҝҷдёӘеӣһзӯ”д»ҺжқҘжІЎжңүиў«йҮҮзәіпјҢеӣ дёәеҜ№дәҺNPMж–°жүӢжқҘиҜҙе®ғе’Ңж–ҮжЎЈдёҖж ·д»Өдәәеӣ°жғ‘гҖӮжҲ‘жқҘиҝҷйҮҢжҳҜеӣ дёәжҲ‘дёҚзҗҶи§ЈеңЁж–ҮжЎЈдёӯдҪ•ж—¶дҪҝз”Ёnpm run-scriptе’ҢдҪ•ж—¶дҪҝз”Ёnpm buildгҖӮиҝҷдёӘеӣһзӯ”并没жңүи®©жҲ‘жӣҙеҠ зҗҶи§ЈгҖӮ - user153923
文档链接已损坏。 - Colm Bhandal

14

最佳答案在这篇SO文章中。

基本上...

npm run == npm run-script

此外,某些常见任务被设为别名,因此以下等式成立...

npm test == npm run-script test

npm build == npm run-script build

对于常见任务,请使用...

npm start

npm build

npm test

npm restart

对于其他所有任务,请使用...

npm run <my-task>


npm build == npm run-script build。我不确定你所说的 == 是什么意思,但根据我的理解,这是不正确的。你的意思是什么? - Colm Bhandal
确实,直到npm v6之前,npm buildnpm run-script build执行的是相同的操作,但现在情况已经不同了。 - undefined

2

TLDR

  • npm build 是一个旧的 CLI 命令,在 CLI 的版本 6 之后,npm 将其停止暴露。
  • "build" 是开发人员为构建项目选择的常用名称。开发人员在他们的 package.json 文件中定义它,并使用一些 npm run-script build 的变体运行它。如果这个用户定义的脚本没有在 package.json 中定义,npm CLI 将抛出一个错误,就像当用户试图传递任何其他不存在的用户定义的脚本给 npm run-script 时一样。

Alias in Wonderland

首先,我会尝试不走进兔子洞,但让我说一些事情。在撰写本文时,run 只是 run-script 的别名,同样的,rumurn 也是如此。在本答案的其余部分中,我将只使用 run-script,因为它似乎是这个命令的 "主" 名称(而不是别名)。但是在下面的任何用法中,如果你感觉奇怪,可以随意在你的脑海中将 run-script 替换为 runrumurn

npm 是一个 CLI

好的,接下来是什么?为了避免混淆,让我们分开考虑,并首先关注一般情况下 npm COMMANDnpm run-script SCRIPT 之间的区别。在这里,我只是使用 COMMANDSCRIPT 分别表示某些任意命令/脚本。

首先,想一想 npm 是什么。它是一个 CLI 工具。就像你能想到的任何其他 CLI 工具一样,它有一些内置命令或 "动词"。例如,如果我们执行 npm ls,我们可以看到已安装包的列表。这里,ls 是传递给 npmCOMMAND 或 "动词"。

The npm run-script command

其中一个 npm CLI 支持的命令/动词是 run-script。这个特定的命令将会:

从一个包的 "scripts" 对象中[运行]任意命令。如果没有提供 "command",它将列出可用的脚本。

(来源)

因此,对于您在package.json文件中定义的任何用户定义的SCRIPT,可以使用npm运行它,只需执行:

npm run-script SCRIPT

SCRIPT几乎可以是任何您喜欢的东西*。这是用户定义的。您可以称之为build,或者您可以称之为billybilbo。显然,您希望将其称为合理的名称。这就是为什么许多开发人员使用术语build来构建他们的项目的原因。

*在SCRIPT上有一些命名限制,因此它并非完全自由格式。请参见此处

npm buildnpm run-script build

现在我们了解了npm是一个CLI工具,我们终于可以解决npm build的问题了。在这里,我们将build作为动词传递给npm CLI。这与将build作为要使用npm run-script build运行的自定义脚本的名称完全不同。

现在问题是,build命令是否是npm CLI的有效动词?答案是:这取决于您使用的npm版本:

因此,在npm CLI的版本6和可能更早版本中,npm build才是有效的。

很可能NPM故意从其CLI中删除了build命令以避免混淆。许多开发人员将build用作package.json中其中一个用户定义的脚本的名称,因此在npm CLI中有另一个build动词会导致两者混淆-因此会出现这样的问题。

测试

为了确认npm buildnpm run-script build确实不同,我在Docker Playground上测试了它们在各种Node/npm版本上的表现。以下是结果:

Node 版本 npm 版本 npm build 的结果 npm run-script build 的结果
node:10.0.0-slim npm@5.6.0 没有输出(命令似乎成功了,但似乎什么也没做) npm ERR! missing script: build
node:12.0.0 npm@6.9.0 没有输出(命令似乎成功了,但似乎什么也没做) npm ERR! missing script: build
node:18.6.0 npm@8.13.2 Unknown command: "build"(命令失败了) npm ERR! missing script: build

造成混淆的旧信息源

在撰写本答案时,我发现npm版本6文档中存在一个错误,像我们这样的许多困惑的人来到此处,错误地将npm buildnpm run-script build混淆起来,增加了混淆。我已经提交了PR解决了这个问题,该PR已合并。希望它很快会反映在npm文档中。


希望本答案中的链接能够保持有效一段时间,但如果失效,请留言告知。


简而言之,“npm build”是一个内置命令,正如NPM创建者所称...它是一个生命周期事件(预定义),而“npm run-script”是执行脚本的任务,因此可以由用户根据不同于“build”生命周期事件的定义。 - vikas pachisia
@vikaspachisia 你是在提出另一种答案,还是针对这个答案有批评意见?如果是前者,请发布您自己的答案。如果是后者,请具体说明您的批评意见。谢谢。 - Colm Bhandal
这绝对不是批评。我只是想在你提供的答案上添加一些内容。但如果你认为这不应该是一个补充,那么我没有问题将其发布为另一个答案(不同的观点),但不是之前回答的替代方案。 - vikas pachisia
欢迎提出建设性的批评意见;在本网站的指导方针内,添加您自己的答案是完全可以的。 - Colm Bhandal
我发现这个答案更适合像我这样的初学者,他们试图理解npm build和npm run-script之间的区别。 - Sahil M.

0
简而言之,“npm build”是一个内置命令,或者正如NPM的创建者所称...它是一个生命周期事件(预定义),而“npm run-script”是执行脚本的任务,因此可以由用户不同于生命周期事件“build”进行定义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接