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

1225

什么是以下两者的区别:

npm install [package_name]

并且:

npm install [package_name] --save

而且:

npm install [package_name] --save-dev

这是什么意思?--save-dev 关键字的真正效果是什么?


5
如果您使用像Jenkins这样的持续集成工具,它是否知道在运行测试时使用devDependencies模块?我认为是的,但这并不是非常明显的。 - Alexander Mills
10
请问您需要的翻译是:“也许编辑问题,同时说明dependencies和devDependencies之间的功能区别是什么?” - Alexander Mills
12
当用户执行 npm install --production 命令时,通过 --save-dev 选项安装的包将不会被重新安装。这是操作上的区别(有关更多信息,请参见 https://docs.npmjs.com/cli/install)。 - Andrew
5
如果您将环境变量 NODE_ENV 设置为生产模式,那么只需运行 npm install 命令,开发依赖包将自动被排除。 - Muhammad Umer
真正的问题是这只是一个不清晰的区分,可以在节点/npm方面得到改进。在开发时,--save和--save-dev之间没有明显的区别。以 moment.js 示例为例:在运行 webpack 时,moment 代码从 node_modules 中取出并包含在项目中。在这个意义上,这与运行 webpack 时所需的 typescript 没有区别。 - Kokodoko
18个回答

14

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

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

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


11

这里的所有解释都很好,但缺少一件非常重要的事情:如何仅安装生产依赖(不包括开发依赖)。 我们通过使用 --save--save-devdependenciesdevDependencies 分离。 要安装所有内容,我们使用:

npm i

为仅安装生产环境的软件包,我们应该使用:

npm i --only=production

10

通常情况下,您不希望将仅用于开发目的的内容添加到生产包中。

使用--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"
},

我认为这是最清晰(简单明了)的答案之一,但我仍然想知道功能上的区别。当我输入 npm install 时,依赖项和 devDependencies 都会被安装,所以似乎没有任何区别? - Kokodoko

9
  1. --save-dev (只用于开发环境,在生产环境中不使用)

  2. --save(生产环境依赖项)

  3. --global-g(全局使用,即可以在本地系统任何位置使用)


1
人们在生产环境中使用npm来做非常酷的事情,Node.js就是一个例子,因此您不希望运行所有的开发工具。 如果您正在使用gulp(或类似工具)创建构建文件以放置在服务器上,则并不重要。

0

基本上我们是编写

npm install package_name

但是特别针对测试目的,我们不需要在应用程序正常运行时运行某些包,因此Node引入了解决此问题的好方法。每当我们编写

npm install package_name --save-dev

那时这个包只是为了开发目的而安装的。


0

我想加入一些我的想法:

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

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

在你的库中,你使用lodash来处理字符串和对象,没有lodash,你的代码无法运行。

如果有人将你的HTTP库作为他的代码的一部分使用,你的代码将与他的代码编译在一起。

你的代码需要lodash,所以你需要将它放在dependencies中进行编译


如果你写一个像 monaco-editor 这样的项目,它是一个 Web 编辑器,

你使用 webpack 打包了所有的代码和你的 产品环境库,当构建完成后,只有一个 monaco-min.js

所以有些人不关心 --save 还是 --save-dependencies,他只需要 monaco-min.js

总结:

  1. 如果有人想编译你的代码(作为库使用),将你的代码中使用的 lodash 放入 dependencies

  2. 如果有人想给你的代码添加更多功能,他需要 单元测试编译器,将它们放入 dev-dependencies


-1

由于--save是npm的默认选项,所以我使用它

npm i package 

而对于 --save-dev,我使用

npm i package -D

默认选项会将包安装为项目依赖项,而 -D 用于开发依赖项,例如测试、lint 等,并安装用于开发过程的包

您可以在此处找到所有标志 https://docs.npmjs.com/cli/v8/commands/npm-install


7
这并没有解释它们之间的区别。这不应该作为答案发布,而应该作为评论。 - YakovL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接