什么是以下两者的区别:
npm install [package_name]
并且:
npm install [package_name] --save
而且:
npm install [package_name] --save-dev
这是什么意思?--save
和 -dev
关键字的真正效果是什么?
假设你正在构建一个应用程序,该应用程序使用moment包来解析和显示日期。你的应用程序是一个调度程序,所以它确实需要这个包来运行,就像没有它无法运行。在这种情况下,你应该使用
npm install moment --save
这将在你的 package.json 中创建一个新值。
"dependencies": {
...
"moment": "^2.17.1"
}
在开发过程中,使用测试套件等工具真的很有帮助,可能需要使用 jasmine-core 和 karma。在这种情况下,您将使用:
npm install jasmine-core --save-dev
npm install karma --save-dev
这也会在您的package.json中创建一个新值。
"devDependencies": {
...
"jasmine-core": "^2.5.2",
"karma": "^1.4.1",
}
即使在文档中,它也要求您对诸如测试套件之类的模块使用 --save-dev
。
依赖项
依赖项在一个简单的对象中指定,该对象将包名称映射到版本范围。版本范围是一个带有一个或多个空格分隔符的字符串。依赖关系还可以用tarball或git URL标识。
请勿在您的依赖项对象中放置测试harnesses或转换器。参见下面的devDependencies。
您不需要测试套件以正常状态运行应用程序,因此它是一种--save-dev
类型的依赖关系,仅此而已。如果您不理解实际发生的情况,很难想象。
取自NPM文档docs#dependencies
--save-dev
用于保存用于开发目的的软件包。
例如:单元测试,代码压缩等。--save
用于保存应用程序运行所需的软件包。默认情况下,NPM会将一个软件包安装在node_modules目录下。当您尝试为应用程序/模块安装依赖项时,需要先安装它们,然后将它们添加到package.json
文件的dependencies
部分中。
--save-dev
将第三方软件包添加到软件包的开发依赖项中。当有人直接运行npm install
来安装您的软件包时,它不会被安装。通常只有当有人首先克隆您的源代码仓库,然后在其中运行npm install
时才安装它。
--save
将第三方软件包添加到软件包的依赖项中。每当有人运行npm install package
时,它将与软件包一起安装。
Dev依赖项是仅用于开发软件包的依赖项。这可能包括测试运行器、编译器、打包工具等。
这两种类型的依赖项都存储在软件包的package.json
文件中。--save
添加到dependencies
,--save-dev
添加到devDependencies
有关更多信息,请参阅npm install文档。
--
请注意,自NPM 5以来,--save
现在是默认选项。因此,不再需要显式使用它。可以通过在不使用--save
的情况下运行npm install
来实现相同的结果。
--save-dev
是用于开发环境的;其他答案都是无用的。这个答案指明了 --save
和 --save-dev
实际上行为不同。 - Aaron Beaudoin让我举个例子,
jest
进行测试,而他们使用mocha
。你想让他们也安装jest
吗?只为了运行你的库吗?不需要。对吧?这就是为什么它们放在devDependencies
中。
当有人执行npm i yourPackage
时,只会安装运行你的库所需的库。其他用于打包你的代码、测试和模拟的库不会被安装,因为你将它们放在devDependencies
中。相当不错,对吧?
那么,为什么开发者需要暴露devDependancies呢?
假设你的包是一个开源包,有上百个人向你的包发送pull request。那么他们如何测试包呢?他们会git clone
你的存储库,当他们执行npm i
时,会安装dependencies以及devDependencies。
devDependencies
,其中包含了你使用的所有测试/构建/模拟库。这的确是一个完美的例子:
$ npm install typescript --save-dev
在这种情况下,您需要在开发过程中使用Typescript(一种可解析Javascript的编程语言),但一旦应用程序部署,它就不再需要,因为所有代码都已被转译为Javascript。因此,在发布的应用程序中包含它是没有意义的。实际上,这只会占用空间并增加下载时间。--save-dev
标记时,该包会被添加到你的 devDependencies
对象中。如果/当有人安装你的包时,所有的 dependencies
都会被下载,但 devDependencies
不会被下载,因为它们在运行时不是必需的。正如答案所述,这可以节省他们的时间和空间。在处理你的包文件时,开发者只需要在包目录内运行 npm install
即可安装 devDependencies
。 - Jasjit Singh Marwahnpm install
时,才会安装 devDependencies
。 - PoolloverNathan--save
命令来安装所有其他依赖项。我开始认为我之前提到的 Yeoman 示例 并不是 最佳实践的好例子。 - wayfarer_boy--save-dev
在这里的每个答案中都越来越不清楚了 :) - Kokodoko--save-dev
将 semver 规范保存在包描述文件的 "devDependencies" 数组中,--save
则保存在 "dependencies" 中。
--save-dev
使包局部安装到您的项目中,而 --save
则将它们安装到您的 node 安装中? - ahnbizcad--save-dev
用于开发应用时使用的模块,但在生产环境中运行它不需要。
--save
用于将模块添加到 package.json 中,并且在应用程序运行时需要这些模块。
例如:express、body-parser、lodash、helmet、mysql 这些模块是在运行应用程序时使用的,使用 --save
将它们放到依赖项中。而 mocha、istanbul、chai、sonarqube-scanner 等模块是在开发过程中使用的,因此将它们放到 dev-dependencies 中。
npm link 或 npm install 命令也会在项目文件夹中安装依赖项和开发依赖项模块。
--save-dev
的头疼
最简单的答案是,在创建面向其他开发人员的软件包并希望将其托管在类似NPM Registry(如lodash、mongoose、express等)的仓库时,--save-dev
非常有用。当您正在构建或编写一个Node服务器时,--save
和--save-dev
之间没有区别,因为您的Node服务器实现对您私有且永远不会发布到NPM上。
NPM安装的工作原理
每当我们使用 npm 安装新包,例如 npm install express,那么 NPM 就会将该包安装到我们的系统中并将其放入 node_modules 文件夹中。现在,NPM 将分析新安装包(例如这种情况下的 express)的 package.json 文件,分析后将安装那些在 express 包的 package.json 文件的 dependencies 部分中提到的所有包。在安装了 express 依赖的这些包之后,NPM 再次分析所有新安装包的 package.json 文件,再次为它们安装包,这个过程会一直持续,直到所有依赖包都可用于正确运行。您可以通过在指向项目目录位置的终端中运行 npm list 来检查软件包依赖项。--save-dev
标志安装mocha,否则NPM会在开发人员使用NPM安装您的包时安装它。因此,如果我们希望某个依赖项在有人从NPM安装我们的包时未被安装,我们必须在开发阶段使用--save-dev
安装该包。
最后一件事
不要将--save-dev
与协作开发混淆,如果有人从源代码版本控制系统(如github)克隆了您的包代码,那么NPM肯定也会安装所有devDependencies,即使用--save-dev
安装的包。npm install <package-name>
安装 npm 包时,您正在安装其作为依赖项。package.json
文件中的 dependencies
列表下(从 npm 5 开始:以前需要手动指定 --save
)。
例如:npm install lodash
按回车键后,请检查 package.json 文件。"dependencies": {
"lodash": "4.x",
},
当您添加-D
标志或--save-dev
时,您正在将其安装为开发依赖项,这将它添加到devDependencies
列表中。
例如:npm install --save-dev lite-server
输入后,请检查您的package.json文件。"devDependencies": {
"lite-server": "^2.6.1"
},
开发依赖项是指仅用于开发的软件包,不需要在生产中使用。例如测试软件包,webpack或Babel。
当您进入生产环境时,如果键入npm install
并且文件夹包含package.json
文件,则它们将被安装,因为npm假定这是一个开发部署。
您需要设置--production
标志(npm install --production
)以避免安装这些开发依赖项。
npm install --production
命令时,通过--save-dev
选项安装的包将不会被重新安装。这是操作上的区别(有关更多信息,请参见 https://docs.npmjs.com/cli/install)。 - AndrewNODE_ENV
设置为生产模式,那么只需运行npm install
命令,开发依赖包将自动被排除。 - Muhammad Umermoment.js
示例为例:在运行 webpack 时,moment
代码从node_modules
中取出并包含在项目中。在这个意义上,这与运行 webpack 时所需的typescript
没有区别。 - Kokodoko