--save和--save-dev有什么区别?

时间:2014-04-06 07:34:11

标签: node.js npm save package

有什么区别:

  

npm install [package_name] --save

  

npm install [package_name] --save-dev

这是什么意思?

18 个答案:

答案 0 :(得分:466)

--save--save-dev之间的差异如果您在自己的项目中尝试过,可能不会立即显示出来。所以这里有几个例子......

让我们假设您正在构建一个使用 moment 包解析和显示日期的应用。您的应用程序是一个调度程序,因此它确实需要运行此程序包,如:无法在没有它的情况下运行。在这种情况下,您将使用

npm install moment --save

这将在package.json

中创建一个新值
"dependencies": {
   ...
   "moment": "^2.17.1"
}

在开发时,使用测试套件等工具确实很有帮助,可能需要jasmine-corekarma。在这种情况下,您将使用

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类型依赖项,仅此而已。你可以看到如果你不理解真正发生的事情,有点难以想象。

直接来自NPM docs docs#dependencies

  

<强>依赖关系

     

依赖关系在映射包名称的简单对象中指定   到版本范围。版本范围是一个包含一个或的字符串   更多以空格分隔的描述符。还可以识别依赖关系   使用tarball或git URL。

     

请不要在依赖项中放置测试工具或转发器   宾语。请参阅下面的devDependencies

即使在文档中,它也会要求您使用--save-dev作为测试工具等模块。

我希望这有帮助并且很清楚。

答案 1 :(得分:435)

  • --save-dev用于保存包以用于开发目的。 示例:单元测试,缩小..
  • --save用于保存 应用程序运行所需的包。

答案 2 :(得分:72)

默认情况下,NPM只是在node_modules下安装一个包。当您尝试为应用/模块安装依赖项时,您需要先安装它们,然后将它们添加到dependencies的{​​{1}}部分。

package.json将第三方软件包添加到软件包的开发依赖项中。当有人安装你的包时,它不会被安装。它通常仅在某人克隆您的源存储库并在其中运行--save-dev时安装。

npm install将第三方软件包添加到软件包的依赖项中。只要有人运行--save,它就会与软件包一起安装。

Dev依赖项是仅用于开发程序包所需的依赖项。这可能包括测试运行器,编译器,打包器等。 两种类型的依赖关系都存储在包的npm install package文件中。 package.json添加--savedependencies添加到--save-dev

npm install文档可以在这里提及。

答案 3 :(得分:45)

一个很好的例子是:

$ npm install typescript --save-dev

在这种情况下,您希望将Typescript(一种javascript可解析的编码语言)用于开发,但是一旦部署了应用程序,就不再需要了,因为所有代码都已转换为javascript。因此,将它包含在已发布的应用程序中是没有意义的。实际上,它只会占用空间并增加下载时间。

答案 4 :(得分:32)

@ andreas-hultgren在this answernpm docs中的建议:

  

如果有人计划在他们的程序中下载和使用您的模块,那么他们可能不希望或不需要下载和构建您使用的外部测试或文档框架。

但是,对于webapp开发,Yeoman(一个安装经过同行评审,预先编写的package.json文件的脚手架工具)将所有包放在devDependencies中,而不依赖于任何依赖项,所以看来至少在 webapp 开发中使用--save-dev是一个安全的选择。

答案 5 :(得分:18)

--save-dev将semver规范保存到&#34; devDependencies&#34;包裹描述符文件中的数组--save将其保存到&#34;依赖关系&#34;代替。

答案 6 :(得分:4)

- save-dev 用于开发应用程序时使用的模块,在生产环境中运行时不需要 - save 用于在package.json中添加它,它是运行应用程序所必需的。

示例:express,body-parser,lodash,helmet,mysql所有这些都是在运行应用程序时使用--save来放入依赖,而mocha,istanbul,chai,sonarqube-scanner都在开发过程中使用,所以把那些处于开发依赖的人。

npm link或npm install还将在项目文件夹中安装dev-dependency模块和依赖模块

答案 7 :(得分:4)

已经提供清晰的答案。但是值得一提的是devDependencies对安装软件包的影响:

  

默认情况下,npm install将安装所有列为package.json中的依赖项的模块。使用--production标志(或将NODE_ENV环境变量设置为production),npm将不会安装devDependencies中列出的模块。

请参阅:https://docs.npmjs.com/cli/install

答案 8 :(得分:4)

让我举个例子

  • 您是一个非常强大的 SERIOUS npm 的开发人员。其中使用不同的测试库来测试软件包。
  • 某用户已下载您的库,并希望在其代码中使用它。他们还需要下载您的测试库吗?也许您使用jest进行测试,而他们使用mocha。您是否还希望他们安装jest?只是要经营你的图书馆?

不。对?这就是为什么它们位于devDependencies中的原因。

当有人这样做时,npm i yourPackage仅会安装运行所需的库。

因此,为什么,开发人员需要公开 devDependancies 吗?

假设您的软件包是一个开源软件包,成百上千的人正在向您的软件包发送请求请求。那么他们将如何测试包装?他们将git clone进行您的仓库,以及何时进行npm i依赖关系以及devDependencies。因为他们没有使用您的包裹。他们正在进一步开发软件包,因此需要devDependencies。

答案 9 :(得分:3)

通常,您不希望使用仅用于开发目的的东西来夸大生产包。

使用--save-dev(或-D)选项来分隔程序包,例如单元测试框架(笑话,茉莉花,摩卡,柴等)

应使用--save(或-S)安装您的应用程序生产所需的任何其他软件包。

npm install --save lodash       //prod dependency
npm install -S moment           // "       "
npm install -S opentracing      // "       "

npm install -D jest                 //dev only dependency
npm install --save-dev typescript   //dev only dependency

如果打开package.json文件,则会在两个不同的部分下看到这些条目:

"dependencies": {
  "lodash": "4.x",
  "moment": "2.x",
  "opentracing": "^0.14.1"
},

"devDependencies": {
    "jest": "22.x",
    "typescript": "^2.8.3"
},

答案 10 :(得分:3)

  1. --save-dev(仅用于开发,不用于生产)

  2. --save(生产依赖)

  3. --global 或 -g(全局使用,即可以在我们本地系统的任何地方使用)

答案 11 :(得分:2)

读完就忘了--save-dev 头疼

最简单的答案--save-dev 在您为其他开发人员创建时很有用并且想要在NPM Registry 托管您的包,例如lodash、mongoose、express 等。当您构建或编写节点服务器时 --save--save-dev 之间没有区别,因为您的 节点服务器 实现对您和您来说都是私有的绝不会在 NPM 上发布。

NPM 安装的工作原理

每当我们使用 npm 安装一个新包时,例如 npm install expressNPM 就会将该包安装到我们的系统中并将其放入 >node_modules 文件夹,现在 NPM 将分析 新安装 包即 expresspackage.json 文件> 在这种情况下,在分析 NPM 后,将安装 express 的 package.json 文件的 dependencies 部分中提到的所有软件包 包。安装express依赖的那些包后,再次分析所有package.json文件新安装的 包并再次为它们安装包,这个循环一直持续到所有包都可以进入 node_modules 文件夹以正常运行。您可以通过在终端中运行 npm list 来检查包依赖项,其中终端应指向您的项目目录

--save-dev 如何与以上解释的内容相关

假设你想创建一个新的,比如express,现在在开发这个新包时,你可能想写一些单元测试代码 并使用任何其他可用的测试包 测试该包,让我们假设在这种情况下使用 mocha。现在您知道 mocha 只需要测试包不需要使用包。在这种情况下,您应该使用 --save-dev 标志安装 mocha,否则 NPM 将在开发人员使用 安装您的软件包时安装它>NPM。因此,如果我们希望在有人从 NPM 安装我们的包时不安装 依赖项,我们必须在开发阶段使用 --save-dev 安装该包.

最后一件事

不要将--save-dev协作开发混用,如果有人从github等源版本控制系统克隆了您的包代码那么NPM 肯定会安装所有devDependencies,即使用--save-dev 安装的包。

答案 12 :(得分:2)

当您使用 npm install 安装 npm 包时,您将其作为依赖项安装。

该包会自动列在 package.json 文件中的依赖项列表下(从 npm 5 开始:在您必须手动指定 --save 之前)。 前任。 npm 安装 lodash 按回车后检查你的 package.json 文件。

“依赖项”:{ "lodash": "4.x",
},

当您添加 -D 标志或 --save-dev 时,您将其安装为开发依赖项,这会将其添加到 devDependencies 列表中。

例如。 npm install --save-dev lite-server 按回车后检查你的 package.json 文件

"devDependencies": { “精简服务器”:“^2.6.1” }

开发依赖项仅作为开发包,在生产中不需要。例如测试包、webpack 或 Babel。

当你进入生产环境时,如果你输入 npm install 并且文件夹包含一个 package.json 文件,它们就会被安装,因为 npm 假设这是一个开发部署。

您需要设置 --production 标志 (npm install --production) 以避免安装那些开发依赖项。

答案 13 :(得分:0)

这里的所有解释都很好,但缺少一个非常重要的事情:如何仅安装生产依赖项? (没有开发依赖性)。 我们使用dependenciesdevDependencies--save--save-dev分开。 要安装所有我们使用的东西:

npm i

要仅安装生产软件包,我们应该使用:

npm i --only=production

答案 14 :(得分:0)

人们在生产中使用npm来处理邪恶的事情,Node.js就是一个例子,所以您不希望运行所有开发工具。

如果您正在使用gulp(或类似工具)创建要放置在服务器上的构建文件,则没关系。

答案 15 :(得分:0)

基本上我们写

npm install package_name

但特别是为了测试目的,我们不需要在应用程序在正常状态下运行时运行一些包,以便 Node 引入解决这个问题的好方法。每当我们写

npm install package_name --save-dev

当时这个包仅用于开发目的。

答案 16 :(得分:0)

npm install默认将所有指定的软件包保存到依赖项中。此外,您还可以使用一些其他标志来控制保存它们的位置和方式:

-P, --save-prod:软件包将出现在您的依赖项中。除非存在-D-O,否则这是默认设置。

-D, --save-dev:软件包将出现在您的 devDependencies 中。

-O, --save-optional:软件包将出现在您的 optionalDependencies 中。

--no-save:防止保存为依赖项

使用上述任何选项将依赖项保存到 package.json 时,还有两个附加的可选标志:

-E, --save-exact:将使用准确的版本配置保存的依赖项,而不是使用npm的默认semver range运算符。

-B, --save-bundle:保存的依赖项也将添加到您的 bundleDependencies 列表中。

答案 17 :(得分:0)

我想添加一些想法

我认为,当有人使用您的代码而不是自己使用代码时,所有的差异都会出现

例如,您编写了一个名为node's request的HTTP库

在您的图书馆中,

您使用lodash处理字符串和对象,如果没有lodash,则代码无法运行

如果有人将您的HTTP库用作其代码的一部分。您的代码将与他一起编译。

您的代码需要输入破折号,因此您需要输入dependencies编译


如果您编写monaco-editor这样的项目,它是一个网络编辑器,

您已使用webpack捆绑了所有代码和product env library,构建完成后,只有monaco-min.js

因此,某人不必区分--save还是--save-dependencies,只有他需要的是monaco-min.js

摘要:

  1. 如果有人要编译您的代码(用作库),   将您的代码使用的lodash放入dependencies

  2. 如果有人想向您的代码添加更多功能,则需要unit testcompiler,将它们放入dev-dependencies