【问题标题】:--save 和 --save-dev 有什么区别?
【发布时间】:2014-05-18 10:39:44
【问题描述】:

有什么区别:

npm install [package_name]

和:

npm install [package_name] --save

和:

npm install [package_name] --save-dev

这是什么意思?而--save-dev关键字的真正作用是什么?

【问题讨论】:

  • 是的,我对此感到困惑 - 如果您使用像 Jenkins 这样的持续集成,Jenkins 是否知道使用 devDependencies 模块来运行测试?我认为是这样,但这并不是很明显。
  • 也许编辑问题还说,dependencies 和 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 并包含在项目中。从这个意义上讲,typescript 没有区别,运行 webpack 时也需要它。

标签: node.js npm save package


【解决方案1】:

如果您在自己的项目中尝试过--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 中。如果您正在开发一个网络应用程序而不是一个供他人使用的包,那么您可能根本不应该担心它。
【解决方案2】:
  • --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”作为依赖项。
【解决方案3】:

默认情况下,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. .. 而不是开发依赖项中的开发人员包。
【解决方案4】:

让我举个例子,

  • 您是一个非常SERIOUS npm 库的开发者,它使用不同的测试库来测试包。
  • 用户下载您的库并希望在他们的代码中使用它。他们是否也需要下载您的测试库?也许您使用jest 进行测试,而他们使用mocha。你想让他们也安装jest 吗? 只是运行你的库?

没有。正确的?这就是他们在devDependencies 的原因。

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

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

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

【讨论】:

    【解决方案5】:

    一个完美的例子是:

    $ npm install typescript --save-dev
    

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

    【讨论】:

    • 同样适用:"$ npm install grunt --save-dev",因为它对开发有用,但对部署没有用。
    • 附注:微软建议将 @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 会被忽略?
    【解决方案6】:

    正如@andreas-hultgren 在this answernpm docs 中所建议的那样:

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

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

    【讨论】:

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

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

    【讨论】:

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

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

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

    npm link 或 npm install 也会在你的项目文件夹中安装开发依赖模块和依赖模块

    【讨论】:

      【解决方案9】:

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

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

      见:https://docs.npmjs.com/cli/install

      【讨论】:

        【解决方案10】:

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

        npm i
        

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

        npm i --only=production
        

        【讨论】:

          【解决方案11】:

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

          使用--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 都会安装,所以似乎没有任何区别?
          【解决方案12】:

          读完就忘了--save-dev头痛

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

          NPM 安装的工作原理

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

          --save-dev 与上述内容有何关联

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

          最后一件事

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

          【讨论】:

            【解决方案13】:

            当您使用 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) 以避免安装这些开发依赖项。

            【讨论】:

              【解决方案14】:
              1. --save-dev(仅用于开发,不用于生产)

              2. --save(生产依赖)

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

              【讨论】:

                【解决方案15】:

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

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

                【讨论】:

                  【解决方案16】:

                  基本上我们写

                  npm install package_name
                  

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

                  npm install package_name --save-dev
                  

                  当时安装此软件包仅用于开发目的。

                  【讨论】:

                    【解决方案17】:

                    我想补充一些我的想法

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

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

                    在您的图书馆中,

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

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

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


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

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

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

                    总结:

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

                    2. 如果有人想为您的代码添加更多功能,他需要unit testcompiler,将它们放入dev-dependencies

                    【讨论】:

                      【解决方案18】:

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

                      npm i package 
                      

                      对于--save-dev,我使用

                      npm i package -D
                      

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

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

                      【讨论】:

                      • 这并没有解释它们之间的区别。这不应该作为答案发布,而是作为评论发布
                      猜你喜欢
                      • 2016-02-03
                      • 1970-01-01
                      • 2016-01-08
                      • 1970-01-01
                      • 2015-07-12
                      • 2011-12-27
                      • 1970-01-01
                      • 2013-10-13
                      相关资源
                      最近更新 更多