npm install和npm run build有什么区别?

233

npm installnpm run build 有什么区别?

在我的项目中,当执行npm install时,有时会出现故障,但是运行npm run build就可以正常工作。

这两个目标 installrun build 的内部工作原理有什么不同?


2
目前接受的答案存在争议。我认为MKP和CTS_AE的回答,在此时更相关。恕我直言,这应该引起管理员或提问者的注意。 - Suhas Chikkanna
4个回答

177

npm install 命令将依赖项安装到您正在开发的Node.js项目的 node_modules/ 目录中。您也可以在另一个 Node.js 项目(module) 上调用 install 命令,以将其安装为您项目的依赖项。

npm run build 命令不起作用,除非您在 package.json 文件中指定了“build”是做什么的。它允许您在项目在另一个项目中使用之前执行任何必要的构建/准备任务。

npm build 是一个内部命令,并由 linkinstall 命令调用,根据build文档

这是由npm link和npm install调用的管道命令。

通常您不会直接使用 npm build 命令,因为它是使用 node-gyp 来构建本机 C/C++ Node 插件的内部命令。


3
参考以下链接中的正确答案,我也认为 npm buildnpm run build 不是同一个意思。个人认为,@churro的回答可能需要进行更正。如果我错了,请纠正我。https://dev59.com/E10a5IYBdhLWcg3wzbUU?noredirect=1&lq=1 - Suhas Chikkanna
npm install 会自动运行所有依赖脚本的 npm run build 命令吗?这个在哪里有文档记录? - Anthony

148

2019年的NPM

npm build已经不存在了。现在必须调用npm run build。更多信息如下。

总结;

npm install: 安装依赖项,然后从package.jsonscripts字段中调用install

npm run build: 从package.jsonscripts字段中运行build字段。


NPM Scripts Field

https://docs.npmjs.com/misc/scripts

你可以将许多内容放入npm的package.json脚本字段中。查看上面的文档链接以获取有关脚本生命周期的更多信息 - 大多数都有前置和后置钩子,您可以在安装、发布、卸载、测试、启动、停止、收缩包、版本之前/之后运行。


复杂的事情

  • npm installnpm run install不同
  • npm install安装package.json的依赖项,然后运行package.jsonscripts.install
    • (本质上在安装依赖项之后调用npm run install
  • npm run install仅运行package.jsonscripts.install,不会安装依赖项。
  • npm build曾经是一个有效的命令(与npm run build相同),但现在已不再是;它现在是一个内部命令。如果运行它,你会得到以下提示:npm WARN build npm build called with no arguments. Did you mean to npm run-script build? 你可以在文档中阅读更多信息:https://docs.npmjs.com/cli/buildhttps://docs.npmjs.com/cli/v6/commands/npm-build

额外说明

仍有两个顶级命令可以运行脚本,它们是:

  • npm startnpm run start相同
  • npm test ==> npm run test

10
“npm build”不再存在这种说法很让人困惑。从某种意义上说,它仍然存在于npm中并且与你在底部提到的警告产生了反应。但实质上,现在它已经不起作用了。“npm build”和“npm run build”的最短摘要可以在另一个问题的答案中找到:https://dev59.com/E10a5IYBdhLWcg3wzbUU。 - bluenote10
我刚刚在一项由Salesforce推广的最近项目中尝试使用yarn,但是yarn没有起作用。但是NPM表现得非常出色。 - bkwdesign
1
链接已经失效,这是更新后的链接:https://docs.npmjs.com/cli/v6/commands/npm-build - BobtheMagicMoose
那么 npm install 会自动运行所有依赖脚本的 npm run build 吗?这个在哪里有文档记录? - Anthony

60
主要区别在于:

npm install是一个npm CLI命令,其执行预定义的任务即在package.json中指定的依赖项(正如Churro所述)。

npm run %command-name%npm run-script %command-name%也是一个CLI命令,预定义为使用指定名称的自定义脚本运行。因此,在本例中,npm run build是一个名为“build”的自定义脚本命令,将执行其中指定的任何操作(例如下面示例的package.json中给出的echo 'hello world')。

请注意以下几点:

  1. 另外,npm buildnpm run build是两个不同的概念,npm run build将执行写在package.json中的自定义操作,而npm build是一个预定义脚本(无法直接使用)。

  2. 你不能在npm run build脚本中指定某些内容并期望npm build执行相同操作。尝试在package.json中验证以下内容:

{
    "name": "demo",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
        "build": "echo 'hello build'"
    },
    "keywords": [],
    "author": "",
    "license": "ISC",
    "devDependencies": {},
    "dependencies": {}
}

运行npm run buildnpm build两个命令,你会看到它们的不同之处。如需了解更多关于命令的内容,请参考npm文档


13
与其“尝试运行此命令”,我希望您能更详细地解释一下npm run buildnpm build之间的区别,使其更易于理解。好的,它们不同,哪些方面不同呢?那么@Churro的答案就是不正确的了吗? - Hendy Irawan
7
“npm build”做什么仍然是个谜。知道这一点会很好。 据我所知,“npm build将按照Churro编写的方式进行”的说法是不正确的。Churro说它将执行在“package.json”中为“build”命令指定的内容(我想是在“scripts”部分定义的)。但是这就是“npm run build”所做的,而“npm build”不会运行“package.json” “scripts”部分中指定的构建命令。除非有其他方法来定义“package.json”中“npm build”应该做什么,但这在这里没有解释,也没有被Churro(或NPM文档,我认为)所解释。 - trollkotze
2
所以我尝试了一下,npm build 提示 _npm WARN build npm build called with no arguments. Did you mean to npm run-script build?_。我觉得它什么也没做。在花费时间阅读所有答案并自己尝试后,我仍然无法确定 npm build 的目的 :(。 - bluenote10

7
  • npm install会安装您package.json文件中指定的依赖项。
  • npm run build会执行名为"build"的脚本,并创建一个运行您应用程序的脚本 - 比如说server.js。
  • npm start会运行名为"start"的脚本,然后是"node server.js"。

很难确定问题具体是什么,但基本上如果您查看脚本配置,我猜测"build"使用某种构建工具来创建您的应用程序,而"start"则假设构建已完成,但如果文件不存在,则会失败。

您可能正在使用bower或grunt - 我记得典型的grunt应用程序将定义这些脚本以及"clean"脚本以删除最新的构建。

构建工具倾向于在bin /、dist /或build /文件夹中创建文件,然后启动脚本调用该文件 - 例如"node build/server.js"。当您的npm start失败时,可能是因为您调用了npm clean或类似的命令来删除最新的构建,导致应用程序文件不存在,从而导致npm start失败。

npm build的源代码 - 触及此问题的讨论 - 可供您查看github。如果您直接运行npm build并且已定义"build"脚本,则它将以错误退出,要求您将构建脚本命名为npm run-script build,因此它与npm run script不同。

我不太确定npm build具体是做什么,但似乎与依赖项中的postinstall和打包脚本有关。我认为这可能确保下载软件包后,为特定环境构建任何CLI构建脚本或依赖项所需的本机库。这就是为什么link和install调用此脚本的原因。


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