ChatGPT解决这个技术问题 Extra ChatGPT

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

有什么区别:

npm install [package_name]

和:

npm install [package_name] --save

和:

npm install [package_name] --save-dev

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

是的,我对此感到困惑 - 如果您使用像 Jenkins 这样的持续集成,Jenkins 是否知道使用 devDependencies 模块来运行测试?我认为是这样,但这并不是很明显。
也许编辑问题还说,依赖项和 devDependencies 之间的功能区别是什么?
当用户执行 npm install --production 时,不会重新安装通过 --save-dev 选项安装的软件包。这就是操作上的差异(有关详细信息,请参阅 https://docs.npmjs.com/cli/install)。
此外,如果您将环境变量 NODE_ENV 设置为生产,那么只有 npm install 会自动排除开发包。
真正的问题是,这只是一个不清楚的区别,可以在 node / npm 方面进行改进。开发时 --save 和 --save-dev 之间没有明显区别。以 moment.js 为例:运行 webpack 时,moment 代码取自 node_modules 并包含在项目中。从这个意义上说,与运行 webpack 时也需要的 typescript 没有区别。

N
Nimantha

如果您在自己的项目中尝试过 --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#dependencies

依赖关系 依赖关系在一个简单的对象中指定,该对象将包名称映射到版本范围。版本范围是具有一个或多个以空格分隔的描述符的字符串。依赖关系也可以使用 tarball 或 git URL 来标识。请不要将测试工具或转译器放在您的依赖项对象中。请参阅下面的 devDependencies。

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


IMO,我认为“保存”关键字是个问题。他们为什么不为开发制作 -dev 标志,为部署制作 -deploy 标志。它比“保存”关键字更有意义。
为什么包不知道(决定)它是发布包还是开发包,并且 --save 用于两者。当包开发人员创建意图时,让安装用户决定这一点似乎很奇怪。
CodeGrue,如果你只使用 jQuery 来测试 React 组件,它将进入 save-dev,但你可能不会真正使用它来构建你的主项目。是的,这是可能的。那么为什么打包者会知道你在用它做什么呢?
清晰得多。我是第一次学习 Bootstra + Node.js 工作流程的嵌入式人。目前尚不清楚有什么区别。
@YakovL save-dev 表示当其他人将您的软件包安装为他们的依赖项时,未安装软件包。在这种情况下,将不需要仅用于运行诸如 start/build 之类的脚本的包,因此将它们放在 dev-dependencies 中。如果您正在开发一个 Web 应用程序而不是一个供他人使用的包,那么您可能根本不应该担心它。
T
Tuong Le

--save-dev 用于保存包以用于开发目的。示例:单元测试,缩小..

--save 用于保存应用程序运行所需的包。


它们有何不同?我什么时候会使用一个与另一个?如果它在 --save-dev 下,我还能在生产中使用它吗?
答案简洁地回答了您的前两个问题。最后一个问题“如果包在 --save-dev 下,我还能在生产中使用它吗”的答案是“不”。虽然这样做当然是可能的,但这不是故意的。
速记版本:-D--save-dev 的缩写,-S--save 的缩写
这个答案令人沮丧地模糊。即使是一个小例子也能帮助更清楚地说明这一点。
请注意,从 npm 版本 5.0.0 开始,不再需要 --save 选项。如果您执行 npm install my-package,它将在 package.json 文件中添加“my-package”作为依赖项。
G
Grateful

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

--save-dev 将第三方包添加到包的开发依赖项中。当有人直接运行 npm install 来安装您的软件包时,它不会被安装。它通常仅在有人首先克隆您的源存储库然后在其中运行 npm install 时安装。

--save 将第三方包添加到包的依赖项中。每当有人运行 npm install package 时,它将与软件包一起安装。

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

npm install 文档可以参考这里。

--

请注意,自 NPM 5 起,--save 现在是默认选项。因此,不再明确需要它。可以在没有 --save 的情况下运行 npm install 以获得相同的结果。


我怀疑这...如果您正在构建一个不会成为从 npm 下载的包的 Web 应用程序,您可以互换使用 --save-dev 和 --save,如果您正在开发一个与他人共享的包,它了解差异很重要。
最后感谢有人在您使用 npm install 时说出它的目的
--save 现在是 npm install 的默认设置,2017 年发布了 npm 5
等等,为什么是复杂的句子?在 DevDependecy 中,开发者可以安装这些包,它只会更新 devDependency。因此,当新开发人员克隆项目代码库并运行 npm install =>这里只有 node_modules 中的 dependency package name is going to install. .. 不是开发依赖项中的开发人员包。
A
Aritra Chakraborty

让我给你举个例子,

你是一个非常严肃的 npm 库的开发者,它使用不同的测试库来测试包。

用户下载您的库并希望在他们的代码中使用它。他们是否也需要下载您的测试库?也许您使用 jest 进行测试,而他们使用 mocha。你想让他们也安装 jest 吗?只是为了运行你的图书馆?

没有权利?这就是他们在 devDependencies 中的原因。

当有人这样做时,npm i yourPackage只会安装RUN您的库所需的库。您用于捆绑代码或测试和模拟的其他库将不会安装,因为您将它们放在 devDependencies 中。很整洁吧?

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

假设您的包是一个开源包,并且有 100 人正在向您的包发送拉取请求。那么他们将如何测试包呢?他们将git clone您的 repo 以及何时执行 npm i dependencies 以及 devDependencies
因为它们是不使用您的包裹。他们正在进一步开发包,因此,为了测试您的包,他们需要通过现有的测试用例以及编写新的测试用例。因此,他们需要使用您的 devDependencies,其中包含您使用的所有测试/构建/模拟库。


J
Jack

一个完美的例子是:

$ npm install typescript --save-dev

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


同样适用于:“$ npm install grunt --save-dev”,因为它对开发很有用,但对部署没有用。
附注:Microsoft 建议将 @types/xxx 包安装为依赖项,而不是 devDependencies github.com/Microsoft/types-publisher/issues/81
我感到困惑的是,这有什么关系?使用 --save 保存的包仍然只保存在 node_modules 文件夹中。该代码未包含在已部署的网站中。
@Kokodoko 当您使用 --save-dev 标志时,包将添加到您的 devDependencies 对象中。如果/当有人安装 您的 软件包时,所有 dependencies 都会被下载,但 devDependencies 不会,因为它们在运行时不是必需的。正如答案所述,这可以节省他们的时间和空间。开发您的包文件本身的开发人员也可以在包目录中运行 npm install 来安装 devDependencies
所以如果你从 github 下载一个 repo 并输入 npm installdevDependencies 会被忽略吗?
C
Community

正如 this answer 中的 @andreas-hultgren 所建议并根据 npm docs

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

但是,对于 webapp 开发,Yeoman(一种安装经过同行评审的预先编写的 package.json 文件等的脚手架工具)将所有包放在 devDependencies 中,而在依赖项中没有任何内容,因此使用 {2 } 至少在 webapp 开发中是一个安全的选择。


请注意,我在使用 gulp 并使用 --save-dev 安装软件包时遇到了问题,其中软件包不会安装其所需的依赖项。运行 --save 安装了那些缺少的依赖项。
我还想指出,我现在将 --save 用于除测试和文档依赖项之外的所有依赖项(根据 npm 文档)。我开始认为我上面提到的 Yeoman 示例不是最佳实践的好示例。
我也这么认为,你为什么需要 --save-dev 只是因为这里的每个答案变得不太清楚:)
a
alex

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


功能上的区别是什么?
这个答案对我来说最有意义,然后 devDependencies 是开发而不是生产所必需的,因此 htmllint、sass 编译等和依赖项是针对生产要求的,例如需要存在才能运行的 Diaporama。
@ahnbizcad 回答得更好here,但主要的功能区别是 devDependencies 不包含传递。
对于还不知道的人来说,这难道不是最直观的描述方式吗?:Dev --save-dev 使包本地化到您的项目,而 --save 使它们本地化到您的节点安装?
N
Nimantha

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

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

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


A
Alireza

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

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

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


N
Nimantha

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

最简单的答案是当您为其他开发人员创建想要托管您的NPM Registry 中的软件包,例如 lodash、mongoose、express 等。在构建或编写 Node Server 时,--save 之间没有区别和 --save-dev,因为您的 Node Server 实现对您来说是私有的,您永远不会在 NPM 上发布它。

NPM 安装的工作原理

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

--save-dev 与上述内容的关系

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

最后一件事

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


R
Ronny Sherer

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

npm i

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

npm i --only=production

i
ivanleoncz

您通常不希望使用仅打算用于开发目的的东西来膨胀生产包。

使用 --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 都会安装,所以似乎没有任何区别?
Y
YakovL

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

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

"dependencies": {
    "lodash": "4.x",  
},

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

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

"devDependencies": {
    "lite-server": "^2.6.1"
},

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

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

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


N
Nimantha

--save-dev(仅用于开发,不用于生产)--save(生产依赖项)--global 或 -g(全局使用,即可以在我们本地系统的任何地方使用)


T
Tristanisginger

人们在生产环境中使用 npm 来做一些很酷的事情,Node.js 就是一个例子,所以你不希望你的所有开发工具都在运行。

如果您使用 gulp(或类似的)来创建构建文件以放在您的服务器上,那么这并不重要。


y
yash sanghavi

基本上我们写

npm install package_name

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

npm install package_name --save-dev

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


n
nuclear

我想添加一些我的想法作为

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

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

在你的图书馆里,

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

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

你的代码需要 lodash,所以你需要输入 dependencies编译

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

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

所以有人不在乎是--save还是--save-dependencies,他只需要monaco-min.js

概括:

如果有人想编译您的代码(用作库),请将您的代码使用的 lodash 放入依赖项中如果有人想为您的代码添加更多功能,他需要单元测试和编译器,将它们放入 dev-dependencies


t
tomcat

因为 --save 是 npm 的默认选项,所以我使用

npm i package 

对于--save-dev,我使用

npm i package -D

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

你可以在这里找到所有的标志https://docs.npmjs.com/cli/v8/commands/npm-install


这并不能解释它们之间的区别。这不应该作为答案发布,而是作为评论发布