有什么区别:
npm install [package_name]
和:
npm install [package_name] --save
npm install [package_name] --save-dev
这是什么意思?--save和-dev关键字的真正影响是什么?
--save
-dev
--save-dev将semver规范保存到包描述符文件中的“devDependence”数组中,--save将其保存到“依赖项”中。
--save-dev
正如@andreas-hultgren在这个答案中建议的那样,根据npm文档:
如果有人计划在他们的程序中下载和使用您的模块,那么他们可能不想或不需要下载和构建您使用的外部测试或留档框架。
然而,对于webapp开发,文书(一个安装同行评审的、预先编写的package.json文件的脚手架工具)将所有包放在devDepend的依赖关系中,而不是依赖关系中,所以至少在webapp开发中使用--save-dev是一个安全的选择。
如果你在自己的项目中尝试过--save和--save-dev,它们之间的区别可能不会立即明显。所以这里有几个例子…
假设您正在构建一个使用时刻包来解析和显示日期的应用程序。您的应用程序是一个调度程序,因此它确实需要此包才能运行,如:不能没有它。在这种情况下,您将使用
npm install moment --save
这将在您的package.json中创造新的价值
"dependencies": {..."moment": "^2.17.1"}
在开发时,使用测试套件等工具确实很有帮助,可能需要茉莉花芯和业力。在这种情况下,您将使用
npm install jasmine-core --save-devnpm install karma --save-dev
这也将在您的package.json中创造新的价值
"devDependencies": {..."jasmine-core": "^2.5.2","karma": "^1.4.1",}
你做不需要测试套件以在正常状态下运行应用程序,所以它是--save-dev类型的依赖,仅此而已。你可以看到,如果你不理解真正发生的事情,这有点难以想象。
直接取自NPM文档文档#依赖关系
依赖关系依赖项在映射包名称的简单对象中指定到版本范围。版本范围是具有一个或更多空格分隔的描述符。也可以识别依赖项使用tarball或git URL。请不要将测试线束或转译器放在您的依赖项中对象。请参阅下面的devDepend的。
依赖关系
依赖项在映射包名称的简单对象中指定到版本范围。版本范围是具有一个或更多空格分隔的描述符。也可以识别依赖项使用tarball或git URL。
请不要将测试线束或转译器放在您的依赖项中对象。请参阅下面的devDepend的。
即使在文档中,它也要求您对测试线束等模块使用--save-dev。
默认情况下,NPM只需在node_modules下安装一个包。当您尝试为应用程序/模块安装依赖项时,您需要首先安装它们,然后将它们添加到package.json的dependencies部分。
package.json
dependencies
--save-dev将第三方包添加到包的开发依赖项中。当有人直接运行npm install来安装您的包时,它不会被安装。通常只有当有人先克隆您的源代码库,然后在其中运行npm install时,它才会被安装。
npm install
--save将第三方包添加到包的依赖项中。每当有人运行npm install package时,它将与包一起安装。
npm install package
开发依赖项是仅开发包所需的依赖项。这可以包括测试运行程序、编译器、打包程序等。这两种类型的依赖关系都存储在包的package.json文件中。--save添加到dependencies,--save-dev添加到devDependencies
devDependencies
npm安装留档可以参考这里。
--
请注意从NPM 5开始,--save现在是默认选项。因此,不再明确需要它。可以在没有--save的情况下运行npm install来实现相同的结果。
一个完美的例子是:
$ npm install typescript --save-dev
在这种情况下,你希望拥有可用于开发的TypeScript(一种javascript可解析的编码语言),但是一旦部署了应用程序,就不再需要了,因为所有代码都已转录为javascript。因此,将其包含在发布的应用程序中是没有意义的。事实上,它只会占用空间并增加下载时间。
--save-dev用于应用程序开发中使用的模块,在正式生产环境中运行时不需要--save用于在package.json中添加它,并且它是运行应用程序所必需的。
例如:Express、body parser、lodash、helmet、mysql所有这些都是在运行应用程序时使用的,使用--save来放置依赖项,而mocha、istanbu、chai、sonarqube-scanner都在开发过程中使用,所以把它们放在开发依赖项中。
npm link或npm install还将在项目文件夹中安装开发依赖模块以及依赖模块
您通常不希望使用仅用于开发目的的东西来膨胀生产包。
使用--save-dev(或-D)选项来分隔包,例如Unit Test框架(jest、jasmine、mocha、chai等)
-D
您的应用程序需要用于生产的任何其他包都应使用--save(或-S)安装。
-S
npm install --save lodash //prod dependencynpm install -S moment // " "npm install -S opentracing // " " npm install -D jest //dev only dependencynpm 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"},
已经提供了明确的答案。但值得一提的是devDependencies如何影响安装包:
默认情况下,npm install将安装package.json中列出的依赖项中的所有模块。使用--生产标志(或者当NODE_ENV环境变量设置为生产时),npm不会安装devDepend的模块。
见:https://docs.npmjs.com/cli/install
我想补充一些我的想法
我认为当有人使用你的代码而不是自己使用时,所有的差异都会出现
例如,您编写了一个名为node's request的HTTP库
node's request
在你的图书馆里,
你使用了洛达什来处理字符串和对象,没有洛达什,你的代码就无法运行
如果有人使用您的HTTP库作为他的代码的一部分。您的代码将与他的一起编译。
你的代码需要巧克力所以你需要把dependencies到编译放进去
如果您编写像monaco-editor这样的项目,它是一个Web编辑器,
monaco-editor
您已经使用webpack捆绑了所有代码和product env library,当构建完成时,只有monaco-min.js
product env library
monaco-min.js
所以有人不在乎--save还是--save-dependencies,他只需要monaco-min.js
--save-dependencies
总结:
如果有人想编译你的代码(用作库),将代码使用的lodash放入dependencies
lodash
如果有人想在你的代码中添加更多功能,他需要unit test和compiler,把它们放在dev-dependencies中
unit test
compiler
dev-dependencies
人们在生产环境中使用npm做一些很酷的事情,Node.js就是一个例子,所以你不希望所有的开发工具都被运行。
如果您正在使用Gulp(或类似的)来创建要放在服务器上的构建文件,那么这并不重要。
让我举个例子,
jest
mocha
不,对吗?这就是为什么他们在devDependencies。
当有人这样做时,npm i yourPackage只会安装运行所需的库。您用于捆绑代码或测试和模拟的其他库将不会安装,因为您将它们放在devDependencies中。很整洁吧?
npm i yourPackage
那么,为什么开发人员需要公开开发依赖吗?
假设你的包是一个开源包,成千上万的人向你的包发送拉取请求。那么他们将如何测试这个包?他们将git clone你的存储库,什么时候他们会做#1、依赖关系和开发依赖。因为他们没有使用你的包。他们正在进一步开发包,因此,为了测试你的包,他们需要通过现有的测试用例以及编写新的。所以,他们需要使用你的devDependencies,其中包含你使用的所有测试/构建/模拟库。
git clone
这里的所有解释都很棒,但缺少一个非常重要的东西:如何仅安装生产依赖项?(没有开发依赖项)。我们使用--save或--save-dev将dependencies与devDependencies分开。要安装我们使用的所有:
npm i
要仅安装生产包,我们应该使用:
npm i --only=production
--save-dev(仅用于开发,不用于生产)
--save(生产依赖项)
--global或-g(全局使用,即可以在本地系统的任何地方使用)
--global
-g
基本上我们写
npm install package_name
但特别是为了测试目的,我们不需要在应用程序正常运行时运行一些包,因此Node引入了解决这个问题的好方法。每当我们写
npm install package_name --save-dev
当时此包仅用于开发目的。
当您使用npm install <package-name>安装npm包时,您将其作为依赖项安装。
npm install <package-name>
包会自动列在package.json文件中的dependencies列表下(从npm 5开始:在您必须手动指定--save之前)。例如。npm install lodash按回车键后,检查package.json文件。
npm install lodash
"dependencies": {"lodash": "4.x",},
当您添加-D标志或--save-dev时,您将其作为开发依赖项安装,这将其添加到devDependencies列表中。
例如。npm install --save-dev lite-server按回车键后检查package.json文件
npm install --save-dev lite-server
"devDependencies": {"lite-server": "^2.6.1"},
开发依赖项旨在作为仅开发的包,在生产中不需要。例如测试包、webpack或Babel。
当您进入生产环境时,如果您键入npm install并且文件夹包含package.json文件,则会安装它们,因为npm假设这是一个开发部署。
您需要设置--production标志(npm install --production)以避免安装这些开发依赖项。
--production
npm install --production
阅读完整并忘记--save-dev头痛
最简单的答案是当你在NPM登记处为开发和想主办创建包时,--save-dev很有用,比如黄豆、猫鼬、快递等,当你构建或编写节点服务器时,--save和--save-dev之间没有区别,因为你的节点服务器实现对你来说是私有的,你永远不会在--save1上发布它。
NPM安装如何工作
每当我们使用npm像npm安装快递安装一个新软件包时,然后NPM将该软件包安装到我们的系统并将其放入node_modules文件夹,现在NPM将分析新安装软件包的package.json文件,即表达在这种情况下,分析后NPM将安装表达软件包的package.json文件的依赖关系部分中提到的所有软件包。在安装表达依赖于NPM的那些软件包后,再次npm安装快递4所有新安装软件包的package.json文件并再次为它们安装软件包,这个循环继续进行,直到所有软件包都可用于node_modules文件夹以正常运行。您可以通过在终端中运行npm安装快递8来检查包依赖关系,终端应该在终端的位置查询您的npm安装快递9。
--save-dev如何与上述解释的内容相关
假设你想创建一个像表达这样的新包,现在在开发这个新包的时候,你可能想写一些单元测试代码并用任何其他可用的测试包测试包,让我们假设在这种情况下是摩卡。现在你知道摩卡只需要测试包而不需要使用包。在这种情况下,你应该使用--save-dev标志安装摩卡,否则每当开发人员使用--save-dev1安装你的包时,--save-dev1都会安装它。所以如果我们希望当有人从--save-dev1安装我们的包时不安装--save-dev3,我们必须在开发阶段使用--save-dev安装该包。
最后一件事
不要将--save-dev与协作开发混合,如果有人从像github这样的源版本管理系统克隆了您的软件包代码,那么NPM肯定会安装所有开发依赖,即使用--save-dev安装的软件包。
因为--Save是npm的默认选项,所以我使用
npm i package
对于--serve-dev,我使用
npm i package -D
默认选项将安装包作为项目依赖项,其中-D用于开发依赖项,如测试、lint等,并为开发过程安装包
你可以在这里找到所有的标志https://docs.npmjs.com/cli/v8/commands/npm-install