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

nfo*_*ort 628 save package node.js npm

有什么区别:

npm install [package_name] --save

npm install [package_name] --save-dev

这是什么意思?

Mic*_*uce 554

之间的区别--save--save-dev你们有没有试过他们都在自己的项目可能不会立即noticable.所以这里有几个例子......

让我们说你正在建立一个使用当前包来解析和显示日期的应用程序.您的应用程序是一个调度程序,因此它确实需要运行此程序包,如:没有它就无法运行.在这种情况下,你会使用

npm install moment --save
Run Code Online (Sandbox Code Playgroud)

这将在package.json中创建一个新值

"dependencies": {
   ...
   "moment": "^2.17.1"
}
Run Code Online (Sandbox Code Playgroud)

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

npm install jasmine-core --save-dev
npm install karma --save-dev
Run Code Online (Sandbox Code Playgroud)

这也会在package.json中创建一个新值

"devDependencies": {
    ...
    "jasmine-core": "^2.5.2",
    "karma": "^1.4.1",
}
Run Code Online (Sandbox Code Playgroud)

不需要测试套件以正常状态运行应用程序,因此它是--save-dev类型依赖项,仅此而已.你可以看到,如果你不理解真正发生的事情,有点难以想象.

直接取自NPM docs docs#dependencies

依赖

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

请不要在依赖项对象中放置测试工具或转换器.请参阅下面的devDependencies.

即使在文档中,它也会要求您使用--save-dev来获取测试工具等模块.

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

  • IMO,我认为'save'关键字是一个问题.他们为什么不为开发制作-dev标志,为部署制作-deploy.它比'save'关键字更有意义. (10认同)
  • CodeGrue,如果你只使用jQuery来测试React组件,它会进入save-dev,但你实际上可能不会用它来构建你的主项目.是的,这是可能的.那么为什么打包者会知道你在做什么呢? (4认同)
  • 为什么包不知道(决定)它是发布包还是开发包,并且 --save 用于两者。当包开发人员创建意图时,让安装用户决定这一点似乎很奇怪。 (2认同)
  • 清楚得多。我是一个初次学习Bootstra + Node.js工作流程的嵌入式人员。袖带之间的区别尚不明显。 (2认同)
  • @YakovL save-dev表示当其他人将软件包作为依赖项安装时,未安装软件包。在这种情况下,将不需要仅用于运行脚本(例如启动/生成)的软件包,因此它们被置于开发依赖关系中。如果您使用的是Web应用程序,而不是供他人使用的软件包,那么您可能根本不必担心。 (2认同)

Tuo*_* Le 501

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

  • 他们有什么不同?我何时会使用一个与另一个?如果它在--save-dev下,我还可以在生产中使用它吗? (133认同)
  • 这个答案令人沮丧地含糊不清.即使是一个小例子也可以帮助我们更清楚地做到这一点. (128认同)
  • 简写版本:`-D`是`--save-dev`的缩写,`-S`是`--save`的缩写 (54认同)
  • 请注意,从npm版本5.0.0开始,不再需要`--save`选项.如果你执行`npm install my-package`,它会在package.json文件中添加"my-package"作为依赖项. (24认同)
  • 答案简洁地回答了你的前两个问题.对于最后一个问题的答案,"如果它在--save-dev下,我仍然可以在生产中使用它"是"不".虽然这样做肯定是可行的,但并不打算这样做. (13认同)
  • 应用工具(保存)与开发人员工具(save-dev) (2认同)
  • 这个问题的最高评价答案是,他们无法区分服务器端和前端项目。在后一种情况下,您将交付已转译的JS / CSS代码,其中“已包含”所有依赖项。您甚至不需要上传`node_modules`。在这样的项目中,您可以安全地“ --save-dev”所有已安装的软件包并完成此操作。 (2认同)

小智 88

默认情况下,NPM只是在node_modules下安装包.当您尝试为应用程序/模块安装依赖项时,您需要先安装它们,然后将它们添加到dependencies您的部分package.json.

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

--save将第三方包添加到包的依赖项中.只要有人跑,它就会与包一起安装npm install package.

Dev依赖项是仅在开发包时需要的依赖项.这可以包括测试运行器,编译器,打包器等.两种类型的依赖关系都存储在包的package.json文件中.--save添加dependencies,--save-dev添加devDependencies

npm安装文档可以在这里参考.

  • 我怀疑这个...你可以互换使用--save-dev和--save如果你正在构建一个不会成为包的网络应用程序,即从npm下载,如果你正在开发一个包与他人分享,它了解差异很重要. (27认同)
  • 再次感谢您在使用npm install时说明其用途的人 (9认同)
  • 随着 2017 年 npm 5 的发布,npm install 现在默认使用 --save (6认同)

Jac*_*ope 54

一个完美的例子是:

$ npm install typescript --save-dev
Run Code Online (Sandbox Code Playgroud)

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

  • @Kokodoko当你使用`--save-dev`标志时,包会被添加到你的`devDependencies`对象中.如果/当有人安装**你的**包时,所有的`dependencies`都会被下载但是`devDependencies`却没有,因为它们在运行时不是必需的.正如答案所述,这为他们节省了时间和空间.处理包文件的开发人员本身可以在包目录中运行`npm install`来安装`devDependencies`. (5认同)
  • 同样适用于:“ $ npm install grunt --save-dev”,因为它对开发有用,但对部署没有用。 (3认同)
  • 我感到困惑的是,这到底有什么关系?使用`--save`保存的软件包仍然只保存在`node_modules`文件夹中。该代码未包含在已部署的网站中。 (2认同)

way*_*boy 33

正如@ andreas-hultgren在这个答案和根据npm文档所建议的那样:

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

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

  • 我还要注意,我现在使用`--save`来测试和文档依赖(除了npm文档).我开始认为上面提到的Yeoman例子不是最佳实践的一个很好的例子. (17认同)
  • 请注意,在使用gulp并通过`--save-dev`安装软件包时遇到了问题,其中软件包不会安装其所需的依赖关系。运行`--save`安装了那些缺少的依赖关系。 (3认同)

ale*_*lex 18

--save-dev将semver规范保存到包描述符文件中的"devDependencies"数组中,--save将其保存为"依赖项".

  • 什么是功能差异? (79认同)
  • 这个答案对我来说最有意义,然后开发需要devDependencies而不是生产,因此htmllint,sass编译等和依赖关系是生产要求,例如Diaporama需要存在才能运行. (5认同)
  • @ahnbizcad它的回答更好[这里](http://stackoverflow.com/questions/18875674/whats-the-difference-between-dependencies-devdependencies-and-peerdependencies)但主要的功能差异是devDependencies不是传递性的. (3认同)

小智 18

读完整并忘记--save-dev头痛

最简单的答案是,当您为其他开发人员--save-dev创建希望将您的包托管在NPM 注册表(如lodash、mongoose、express等)时,这很有用。当您构建或编写节点服务器时,和之间没有区别,因为您的节点服务器实现对您来说是私有的,您永远不会在NPM上发布它。--save--save-dev

NPM 安装的工作原理

每当我们使用npm安装一个新包(例如npm installexpress)时,NPM都会将该包安装到我们的系统并将其放入node_modules文件夹中,现在NPM将分析新安装的包(即在本例中为express)的package.json文件,分析后NPM将安装Express包的package.json文件的依赖项部分中提到的所有包。安装完express所依赖的包后,NPM再次分析所有新安装的包的package.json文件并再次为它们安装包,这个循环一直持续到所有包都可以进入node_modules文件夹并正常运行。您可以通过在终端中运行npm list来检查包依赖关系,其中终端应指向项目目录的位置。

--save-dev与上述解释的内容有什么关系

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

最后一件事

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


小智 16

当您使用 安装 npm 包时npm install <package-name>,您将其安装为依赖项。

该包会自动列在package.json文件中的列表下dependencies(从 npm 5 开始:在您必须手动指定之前--save)。
前任。npm install lodash
按 Enter 键后检查您的 package.json 文件。

"dependencies": {
    "lodash": "4.x",  
},
Run Code Online (Sandbox Code Playgroud)

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

前任。npm install --save-dev lite-server
按 Enter 键后检查您的 package.json 文件

"devDependencies": {
    "lite-server": "^2.6.1"
},
Run Code Online (Sandbox Code Playgroud)

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

当您投入生产时,如果您键入npm install并且文件夹包含package.json文件,则会安装它们,因为 npm 假定这是开发部署。

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


Ari*_*rty 13

让我给你举个例子,

  • 您是一个非常认真的 npm 的开发人员。使用不同的测试库来测试包。
  • 用户下载了您的库,并希望在其代码中使用它。他们还需要下载您的测试库吗?也许您jest用于测试,而他们使用mocha。您是否也要安装它们jest只是要运行您的库?

无权利?这就是为什么他们进入devDependencies

当有人这样做时,将仅安装运行npm i yourPackage的库所需的库。您以前用来捆绑代码或进行测试和模拟的其他库将不会安装,因为您将它们放入了。很整洁吧?devDependencies

那么,为什么开发人员需要公开devDependancies

假设您的软件包是一个开源软件包,成百上千的人正在向您的软件包发送请求请求。那么他们将如何测试包装?他们将为git clone您提供仓库,以及何时npm i进行依赖以及devDependencies
因为他们没有使用您的包裹。他们正在进一步开发软件包,因此,为了测试您的软件包,他们需要通过现有的测试用例以及编写新的用例。因此,他们需要使用您的工具devDependencies,其中包含您使用的所有测试/构建/模拟库。

  • 这比公认的答案以及具有最高票数的答案要好得多,因为该答案实际上更实用。谢谢! (3认同)
  • 这应该是选择的答案。所有其他答案并没有真正解释为什么您会使用其中一个而不是另一个。 (3认同)
  • 我同意这应该是公认的答案,我没有从当前的答案中学到任何有意义的东西。谢谢 (3认同)

Ron*_*rer 11

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

npm i
Run Code Online (Sandbox Code Playgroud)

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

npm i --only=production
Run Code Online (Sandbox Code Playgroud)


小智 9

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

  2. --save(生产依赖)

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


Ali*_*eza 7

已经提供了明确的答案。但是值得一提的是如何devDependencies影响安装软件包:

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

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


小智 6

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

使用--save-dev(或-D)选项来分隔程序包,例如单元测试框架(Jest,Jasmine,mocha,chai等)

您的应用需要生产的其他任何软件包,都应使用--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
Run Code Online (Sandbox Code Playgroud)

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

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

"devDependencies": {
    "jest": "22.x",
    "typescript": "^2.8.3"
},
Run Code Online (Sandbox Code Playgroud)


Bis*_*dev 5

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

示例:express,body-parser,lodash,helmet,mysql所有这些都在运行应用程序时使用–保存以放置依赖项,而在开发过程中使用mocha,istanbul,chai,sonarqube-scanner,因此将它们放在dev中-依赖性。

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