之间有什么区别?
npm install [package_name] --save
和:
npm install [package_name] --save-dev
这是什么意思?
npm install --production
。那就是操作上的差异(有关更多信息,请参见https://docs.npmjs.com/cli/install)。
NODE_ENV
为生产,那么它将 npm install
自动排除开发包。
之间有什么区别?
npm install [package_name] --save
和:
npm install [package_name] --save-dev
这是什么意思?
npm install --production
。那就是操作上的差异(有关更多信息,请参见https://docs.npmjs.com/cli/install)。
NODE_ENV
为生产,那么它将 npm install
自动排除开发包。
Answers:
--save-dev
用于保存软件包以供开发。示例:单元测试,缩小--save
用于保存应用程序运行所需的软件包。-D
的缩写--save-dev
和-S
简称--save
--save
不再需要该选项。如果这样做npm install my-package
,它将在package.json文件中添加“ my-package”作为依赖项。
如果您在自己的项目中都尝试过两者之间的差异--save
,则--save-dev
可能不会立即注意到。所以这是一些例子...
假设您正在构建一个使用即时包来解析和显示日期的应用程序。您的应用是调度程序,因此它确实需要运行此程序包,例如:没有它就无法运行。在这种情况下,您将使用
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
类型依赖项,仅此而已。您可以看到如果不了解实际情况,那将很难想象。
直接取自NPM docs docs#dependencies
依存关系
依赖关系是在一个简单的对象中指定的,该对象将程序包名称映射到版本范围。版本范围是一个字符串,具有一个或多个以空格分隔的描述符。依赖关系也可以通过tarball或git URL进行标识。
请不要在您的依赖项对象中放置测试工具或编译器。请参阅下面的devDependencies。
即使在文档中,它也会要求您将--save-dev用于测试工具之类的模块。
我希望这会有所帮助并且很清楚。
默认情况下,NPM只是在node_modules下安装一个软件包。当您尝试为应用程序/模块安装依赖项时,您需要先安装它们,然后将其添加到的dependencies
部分中package.json
。
--save-dev
将第三方程序包添加到程序包的开发依赖项中。当有人安装您的软件包时,将不会安装它。通常只有在有人克隆您的源存储库并npm install
在其中运行时才安装它。
--save
将第三方程序包添加到程序包的依赖项中。每当有人运行时,它将与软件包一起安装npm install package
。
开发依赖项是仅开发软件包所需的那些依赖项。这可以包括测试运行程序,编译器,打包程序等。两种类型的依赖关系都存储在程序包的package.json
文件中。--save
添加到dependencies
,--save-dev
添加到devDependencies
可以在这里参考npm安装文档。
dependency package name is going to install.
在node_modules中运行npm install =>时,而不是开发人员的程序包,如Dev-dependency中那样。
一个完美的例子是:
$ npm install typescript --save-dev
在这种情况下,您希望可以使用Typescript(一种JavaScript解析的编码语言)进行开发,但是一旦部署了该应用程序,就不再需要了,因为所有代码都已被转换为javascript。因此,将其包含在已发布的应用程序中是没有意义的。确实,这只会占用空间并增加下载时间。
--save
保存的软件包仍仅保存在该node_modules
文件夹中。该代码未包含在已部署的网站中。
--save-dev
标志时,该包将添加到您的devDependencies
对象中。如果/当有人安装您的软件包时,将全部dependencies
下载但devDependencies
不下载,因为在运行时不需要它们。如答案所述,这可以节省他们的时间和空间。打包文件本身的开发人员也可以npm install
在package目录中运行,以进行安装devDependencies
。
npm install
,则将devDependencies
其忽略?
让我举一个例子,
jest
用于测试,而他们使用mocha
。您是否也要安装它们jest
?只是要运行您的库?没有权利?这就是为什么他们进入devDependencies
。
当有人这样做时,将仅安装运行您npm i yourPackage
的库所需的库。您以前用来捆绑代码或进行测试和模拟的其他库将不会安装,因为您将它们放入了。很整洁吧?devDependencies
那么,为什么开发人员需要公开devDependancies?
假设您的软件包是一个开源软件包,成百上千的人正在向您的软件包发送请求请求。那么他们将如何测试包装?他们将为git clone
您提供仓库,以及何时npm i
进行依赖以及devDependencies。
因为他们没有使用您的包裹。他们正在进一步开发软件包,因此,为了测试您的软件包,他们需要通过现有的测试用例以及编写新的用例。因此,他们需要使用您的工具devDependencies
,其中包含您使用的所有测试/构建/模拟库。
正如@ andreas-hultgren在此答案中建议的,并根据npm docs:
如果有人计划在其程序中下载和使用您的模块,则他们可能不想或不需要下载并构建您使用的外部测试或文档框架。
但是,对于webapp开发,Yeoman(一种安装了经过同行评审的,预先编写的package.json文件的脚手架工具)将所有程序包都放置在devDependencies中,而没有任何依赖项,因此使用似乎--save-dev
是一个安全的选择至少在webapp开发中。
--save-dev
如果软件包无法安装其所需的依赖关系,则会遇到问题。运行--save
安装了那些缺少的依赖项。
--save
,除了测试和文档依赖项之外,我现在都在使用它(根据npm docs)。我开始认为上面提到的Yeoman示例不是最佳实践的好示例。
--save-dev
的只是这里的每个答案都变得不清楚:)
--save-dev
将semver规范保存到程序包描述符文件中的“ devDependencies”数组中,--save
而是将其保存到“ dependencies”中。
--save-dev
使程序包在项目中本地化,而使程序包--save
在节点安装中本地化?
已经提供了明确的答案。但是值得一提的是如何devDependencies
影响安装软件包:
默认情况下,npm install将安装所有列为package.json中的依赖项的模块。使用--production标志(或将NODE_ENV环境变量设置为production时),npm将不会安装devDependencies中列出的模块。
通常,您不希望使用仅用于开发目的的东西来夸大生产包。
使用--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
如果打开package.json
文件,则将在两个不同的部分下看到这些条目:
"dependencies": {
"lodash": "4.x",
"moment": "2.x",
"opentracing": "^0.14.1"
},
"devDependencies": {
"jest": "22.x",
"typescript": "^2.8.3"
},
我想补充一些想法
我认为,当有人使用您的代码而不是自己使用代码时,所有的差异都会出现
例如,您编写了一个名为 node's request
在您的书架中
您使用lodash处理字符串和对象,如果没有lodash,则代码无法运行
如果有人将您的HTTP库用作其代码的一部分。您的代码将与他一起编译。
您的代码需要lodash,因此您需要dependencies
进行编译
如果您编写了一个项目monaco-editor
,例如一个网络编辑器,
您已经捆绑了所有代码,并且product env library
使用的webpack在构建完成后仅包含一个monaco-min.js
因此,某人不介意是否--save
或--save-dependencies
,仅他需要的是monaco-min.js
摘要:
如果有人要编译您的代码(用作库),请将lodash
您的代码使用的代码放入dependencies
如果有人想向您的代码添加更多功能,则需要unit test
和compiler
,将其放入dev-dependencies
人们在生产中使用npm来处理邪恶的事情,Node.js就是一个例子,因此您不希望运行所有开发工具。
如果您正在使用gulp(或类似工具)来创建要放在服务器上的构建文件,那么这并不重要。