npm package.json 文件中的依赖项、devDependencies 和 peerDependencies 有什么区别?

问:

This documentation 对我的问题的回答很差。我不明白那些解释。有人能用更简单的话说吗?如果很难选择简单的单词,也许有例子?

EDIT 还添加了 peerDependencies,它密切相关,可能会引起混淆。

答1:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

重要行为差异总结:

依赖项安装在两者上: npm install 从包含 package.json 的目录 npm install $package 在任何其他目录

从包含 package.json 的目录中安装 npm

npm install $package 在任何其他目录上

devDependencies 是:也安装在 npm install 包含 package.json 的目录上,除非你通过 --production 标志(去投票 Gayan Charith 的答案),或者如果 NODE_ENV=production 环境变量设置为 not installed on npm install "$包”在任何其他目录上,除非你给它 --dev 选项。不会传递安装。

也安装在 npm install 包含 package.json 的目录上,除非您通过 --production 标志(去投票 Gayan Charith 的答案),或者如果设置了 NODE_ENV=production 环境变量

没有安装在任何其他目录上的 npm install “$package” 上,除非你给它 --dev 选项。

不会传递安装。

peerDependencies:在 3.0 之前:如果缺少,则始终安装,如果不同的依赖项将使用多个不兼容版本的依赖项,则会引发错误。预计从 3.0 开始(未经测试):如果在 npm install 上丢失,则发出警告,您必须自己手动解决依赖关系。运行时,如果缺少依赖项,则会出现错误(@nextgentech 提到)这很好地解释了这一点:https://flaviocopes.com/npm-peer-dependencies/ 在版本 7 中自动安装 peerDependencies 除非上游依赖项冲突存在无法自动解决

3.0 之前:如果缺少,则始终安装,如果不同的依赖项将使用多个不兼容版本的依赖项,则会引发错误。

预计从 3.0 开始(未经测试):如果在 npm install 上丢失,则发出警告,您必须自己手动解决依赖关系。运行时,如果缺少依赖项,则会出现错误(@nextgentech 提到)这很好地解释了它:https://flaviocopes.com/npm-peer-dependencies/

在版本 7 中 peerDependencies 会自动安装,除非存在无法自动解决的上游依赖冲突

传递性(Ben Hutchison 提到):依赖项是传递安装的:如果 A 需要 B,B 需要 C,则安装 C,否则,B 无法工作,A 也不会。 devDependencies 不会传递安装。例如,我们不需要测试 B 来测试 A,因此可以省略 B 的测试依赖项。

依赖项是传递安装的:如果 A 需要 B,而 B 需要 C,则安装 C,否则,B 不能工作,A 也不能工作。

devDependencies 不会传递安装。例如,我们不需要测试 B 来测试 A,因此可以省略 B 的测试依赖项。

此处未讨论的相关选项:

bundledDependencies 在以下问题上进行了讨论:与 npm 中的正常依赖关系相比 bundledDependencies 的优势

optionalDependencies(由 Aidan Feldman 提到)

开发依赖

dependencies 需要运行,devDependencies 仅用于开发,例如:单元测试、CoffeeScript 到 JavaScript 的转换、缩小、…

如果您要开发一个包,请下载它(例如通过 git clone),转到包含 package.json 的根目录,然后运行:

npm install

既然你有实际的源代码,很明显你想开发它,所以默认情况下,还安装了 dependencies(因为你当然必须运行开发)和 devDependency 依赖项。

但是,如果您只是想要安装软件包以使用它的最终用户,您可以从任何目录执行:

npm install "$package"

在这种情况下,您通常不需要开发依赖项,因此您只需获取使用包所需的内容:dependencies。

如果您真的想在这种情况下安装开发包,您可以将 dev 配置选项设置为 true,可能从命令行设置为:

npm install "$package" --dev

该选项默认为 false,因为这种情况不太常见。

peerDependencies

(3.0前测试)

来源:https://nodejs.org/en/blog/npm/peer-dependencies/

使用常规依赖项,您可以拥有多个版本的依赖项:它只是安装在依赖项的 node_modules 中。

例如,如果 dependency1 和 dependency2 都依赖于不同版本的 dependency3,项目树将如下所示:

root/node_modules/
                 |
                 +- dependency1/node_modules/
                 |                          |
                 |                          +- dependency3 v1.0/
                 |
                 |
                 +- dependency2/node_modules/
                                            |
                                            +- dependency3 v2.0/

但是,插件是通常不需要其他包的包,在此上下文中称为主机。反而:

主机需要插件

插件提供主机期望找到的标准接口

只有主机会被用户直接调用,所以它必须只有一个版本。

例如,如果 dependency1 和 dependency2 对等点依赖于 dependency3,则项目树将如下所示:

root/node_modules/
                 |
                 +- dependency1/
                 |
                 +- dependency2/
                 |
                 +- dependency3 v1.0/

即使您从未在 package.json 文件中提及 dependency3,也会发生这种情况。

我认为这是 Inversion of Control 设计模式的一个实例。

对等依赖的一个典型例子是 Grunt、主机和它的插件。

例如,在像 https://github.com/gruntjs/grunt-contrib-uglify 这样的 Grunt 插件上,您会看到:

grunt 是对等依赖

唯一的 require(‘grunt’) 正在测试中/:程序实际上并未使用它。

然后,当用户将使用插件时,他将通过添加 grunt.loadNpmTasks(‘grunt-contrib-uglify’) 行隐式地从 Gruntfile 中要求插件,但用户将直接调用 grunt。

如果每个插件都需要不同的 Grunt 版本,这将不起作用。

手动的

我认为文档很好地回答了这个问题,也许你对节点/其他包管理器不够熟悉。我可能只是了解它,因为我对 Ruby bundler 有所了解。

关键线是:

这些东西将在从包的根目录执行 npm link 或 npm install 时安装,并且可以像任何其他 npm 配置参数一样进行管理。有关该主题的更多信息,请参阅 npm-config(7)。

然后在 npm-config(7) 下找到 dev:

Default: false
Type: Boolean

Install dev-dependencies along with packages.

啊。我看我理解错了。您的回答看起来好像 npm install package 是一个命令,您将使用它来安装所有不是开发依赖项的软件包,而不是我现在认为您的意思,即“安装名为 [package] 的软件包”,这就是我的方式在阅读本文之前认为它有效。如果我是你,我会编辑说 [package-name] 这清楚地表明你的意思是“插入名称-here”。

这很棒!我从来没有意识到,但是这个答案告诉我,依赖项与 devDependencies 的区别仅在您要发布 npm 包时才适用。如果您只是在开发应用程序或站点,那么它应该没有太大关系。谢谢!

应该更新这篇文章以反映即将发布的 npm@3 中更改的 peerDependencies 行为。来自 blog.npmjs.org/post/110924823920/npm-weekly-5:“我们将不再自动下载对等依赖项。相反,如果尚未安装对等依赖项,我们会警告您。这需要您手动解决 peerDependency 冲突,但在很长一段时间内运行它应该可以减少你最终遇到包依赖项的棘手问题。”

此外,依赖包不会传递地安装 devDependencies。示例:包 A 依赖于包 B。包 B 依赖于包 C,B 也依赖于包 D。如果从包 A 运行 npm install,您将获得 B 和 C,但不会获得 D。

请务必注意,当 NODE_ENV 设置为 production 时,不会安装 devDependencies。

答2:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

如果您不想安装 devDependencies,您可以使用 npm install --production

npm install --save 是为了软件依赖?

npm install 将安装所有依赖项。当您也想将特定模块添加到 package.json 时,使用 --save 标志。例如:- npm install uglify --save 将在您的项目文件夹中安装 uglify 并将 uglify 添加到项目 package.json 文件中。

因为我们正在讨论 devDependencies,所以您可以使用 --save-dev 将新模块保存为 devDependency。示例: npm install uglify --save-dev

从 npm 5 开始,不再需要 --save 选项。如果您执行“npm install my-package”,它会将 my-package 作为依赖项添加到您的 package.json 文件中。

从 npm 5 开始,不再需要 --save 选项。这真是个好消息!我以前没有意识到这一点。我总是觉得烦人的是大多数文档忽略了 --save 选项,而实际上不保存您添加依赖项的事实几乎没有意义。

答3:

huntsbot.com – 高效赚钱,自由工作

例如,mocha 通常是一个 devDependency,因为在生产中不需要测试,而 express 是一个依赖项。

我倾向于将测试作为依赖项,因为您可能希望在启动生产服务器之前运行自测

相反,我建议使用像 Hudson 或 CircleCI 这样的持续集成服务来运行您的测试,然后在测试通过时部署到生产环境。

测试实际服务器可能仍然相关,因为 CI 服务器可能与 prod 服务器有所不同,并且这种差异可能会阻止应用程序启动......

@Nicole 你为什么要让你的登台服务器在配置上与你的产品不同?

再说一次,将测试依赖项添加为常规依赖项会引入一大堆额外的库,每个库都可能以某种方式失败。我会倾向于(双关语!)使用尽可能少的代码的轻量级生产服务器。请记住,最好的代码是没有代码!

答4:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

依赖项 项目需要运行的依赖项,例如提供从代码调用的函数的库。它们是传递安装的(如果 A 依赖于 B 依赖于 C,则 npm install on A 将安装 B 和 C)。示例:lodash:您的项目调用了一些 lodash 函数。

devDependencies 您仅在开发或发布期间需要的依赖项,例如将您的代码编译成 javascript、测试框架或文档生成器的编译器。它们不是可传递安装的(如果 A 依赖于 B dev-依赖于 C,则 npm install on A 将仅安装 B)。示例: grunt:您的项目使用 grunt 来构建自己。

peerDependencies 项目在父项目中挂钩或修改的依赖项,通常是其他库或工具的插件。它只是为了检查,确保父项目(将依赖于您的项目的项目)依赖于您挂钩的项目。因此,如果您制作了一个向库 B 添加功能的插件 C,那么制作项目 A 的人如果依赖于 C,则需要依赖于 B。它们没有安装(除非 npm < 3),它们只是检查。示例: grunt:您的项目为 grunt 添加了功能,并且只能用于使用 grunt 的项目。

本文档很好地解释了对等依赖项:https://nodejs.org/en/blog/npm/peer-dependencies/

此外,随着时间的推移,npm 文档也得到了改进,现在对不同类型的依赖项有了更好的解释:https://github.com/npm/cli/blob/latest/docs/content/configuring-npm/package-json.md#devdependencies

应该是市场作为“答案” - 清晰整洁,“peerDependencies”下的第一句话正确解释了所有内容,没有深入研究如何在 npm 中解析版本,这不需要了解 peerDependecies 的用途。

最后一个对 peerDependencies 的回答已经满足了“为什么?”而不是“如何?”。非常有帮助!

答5:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

要将包保存到 package.json 作为开发依赖项:

npm install "$package" --save-dev

当您运行 npm install 时,它将同时安装 devDependencies 和 dependencies。为避免安装 devDependencies 运行:

npm install --production

你也可以使用:npm i -S

答6:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

有一些模块和包仅用于开发,而在生产中不需要。就像它在 documentation 中所说的那样:

如果有人计划在他们的程序中下载和使用您的模块,那么他们可能不想或不需要下载和构建您使用的外部测试或文档框架。在这种情况下,最好在 devDependencies 哈希中列出这些附加项。

如果您在生产环境中只运行 bundle.js 文件怎么办?你真的需要那些依赖吗?

如果你在服务器上运行 bundle.js,你正在做服务器端 webpack 或其他东西......请检查是否是这种情况,因为它通常不是,实际上需要大量工作才能使其正常运行(我知道,因为我这样做了)。我怀疑您的 bundle.js 只是提供给浏览器并包含客户端代码。

让我困惑的部分是,这里的生产是什么?是 CDN 服务器,我在其上部署构建还是运行构建的客户端浏览器?

答7:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

在我阅读了 a blog post 关于主题 Ciro mentioned above 的这段片段之前,peerDependencies 对我来说并不是很有意义:

[插件] 需要的是一种表达插件及其主机包之间“依赖关系”的方式。某种说法,“我只在插入我的主机包的 1.2.x 版本时工作,所以如果你安装我,请确保它与兼容的主机一起使用。”我们称这种关系为对等依赖。

该插件确实需要特定版本的主机…

peerDependencies 用于插件、需要“主机”库来执行其功能的库,但可能是在发布最新版本的主机之前编写的。

也就是说,如果我为 HostLibraryX v3 写 PluginX v1 并走开,则无法保证 PluginX v1 在 HostLibraryX v4(甚至 HostLibraryX v3.0.1)发布时会起作用。

…但插件不依赖于主机…

从插件的角度来看,它只是向宿主库添加了功能。我并不真正“需要”主机向插件添加依赖项,并且插件通常并不真正依赖于它们的主机。如果您没有主机,则该插件不会无害地执行任何操作。

这意味着 dependencies 并不是真正适合插件的概念。

更糟糕的是,如果我的主机被视为依赖项,我们最终会遇到这种情况 the same blog post mentions (稍作编辑以使用此答案由主机和插件组成):

但是现在,[如果我们将 HostLibraryX 的现代版本视为 PluginX 的依赖项,] 运行 npm install 会导致意外的依赖关系图 ├── HostLibraryX@4.0.0 └─┬ PluginX@1.0.0 └── HostLibraryX@ 3.0.0 我将把插件使用与主应用程序不同的 [HostLibraryX] API 带来的细微故障留给您想象。

…而且主机显然不依赖于插件…

…这就是插件的重点。现在,如果主机足够好,可以包含所有插件的依赖信息,那将解决问题,但这也会引入一个巨大的新文化问题:插件管理!

插件的全部意义在于它们可以匿名配对。在一个完美的世界里,让主人管理它们会很整洁,但我们不需要图书馆放猫。

如果我们不是等级依赖的,也许我们是内部依赖的同伴…

相反,我们有成为同行的概念。主机和插件都不在对方的依赖桶中。两者都生活在依赖图的同一级别。

…但这不是一种可自动化的关系。 <<< 钱球!!!

如果我是 PluginX v1 并且 期望 是 HostLibraryX v3 的对等点(即 具有 的 peerDependency),我会这样说。如果您已自动升级到最新的 HostLibraryX v4(请注意是版本 4)并且已安装 Plugin v1,您需要知道,对吧?

npm 无法为我处理这种情况 –

“嘿,我看到你在使用 PluginX v1!我正在自动将 HostLibraryX 从 v4 降级到 v3,kk?”

… 或者…

“嘿,我看到您正在使用 PluginX v1。这需要 HostLibraryX v3,您在上次更新期间将其留在了尘埃中。为了安全起见,我将自动卸载 Plugin v1!!1!

不怎么样,npm?!

所以 npm 没有。它会提醒您注意这种情况,并让您确定 HostLibraryX v4 是否适合 Plugin v1。

结尾

插件中良好的 peerDependency 管理将使这个概念在实践中更直观地工作。从the blog post,再次…

一条建议:与常规依赖不同,对等依赖要求应该宽松。您不应该将您的对等依赖项锁定到特定的补丁版本。如果一个 Chai 插件对等依赖于 Chai 1.4.1,而另一个依赖于 Chai 1.5.0,那真的很烦人,仅仅是因为作者很懒,没有花时间弄清楚他们是 Chai 的实际最低版本兼容。

答8:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

一个让我更清楚的简单解释是:

当您部署应用程序时,需要安装依赖项中的模块,否则您的应用程序将无法运行。 devDependencies 中的模块不需要安装在生产服务器上,因为您不是在该机器上开发。 link

那么,如果我们正在制作网站并且在 prod 版本中,所有库都将内联到 vendor.js 中,如果已编译的代码提交到 repo 中,我们所有的 deps 都应该是 dev deps?它应该被提交,否则很奇怪你必须编译模块,而不仅仅是安装它(并且测试也在这里的某个地方,因为子模块的任何变化都可能导致回归)......

很棒的答案,但有一个问题?可能的 Webpack 会构建损坏的包吗?我的猜测是 devDependencies 包在产品版本中不起作用,webpack -p 我的意思是。请回答我的问题。

如果在生产构建过程中出现任何问题,您的部署过程应该设计为在构建时显示错误并且不会将损坏的代码推送到生产环境(例如,您可以尝试 Jenkins)。无论如何,不需要在生产服务器上安装 Devdependencies。

那么对等依赖呢?

答9:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

我想在答案中添加我对这些依赖项解释的看法

依赖项用于在您的代码库中直接使用,通常最终出现在生产代码中的东西,或代码块

devDependencies 用于构建过程,帮助您管理最终代码的工具,第三方测试模块,(例如 webpack 的东西)

CSS资产呢?

答10:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

我找到了一个简单的解释。

简短的回答:

依赖项“…是您的项目真正需要能够在生产中工作的那些。”

devDependencies “…是您在开发过程中需要的那些。”

peerDependencies “如果你想创建和发布自己的库,以便它可以用作依赖项”

这篇文章中的更多详细信息:https://code-trotter.com/web/dependencies-vs-devdependencies-vs-peerdependencies

最佳答案非常具有描述性和详细信息,但这个答案 ELI5'd peerDependencies 对我来说。

答11:

huntsbot.com – 高效赚钱,自由工作

简而言之

依赖项 - npm install --save-prod 在生产环境中安装应用程序所需的包。 DevDependencies - npm install --save-dev 安装仅本地开发和测试所需的包 只需键入 npm install 即可安装 package.json 中提到的所有包

因此,如果您在本地计算机上工作,只需键入 npm install 并继续 😃

原文链接:https://www.huntsbot.com/qa/QQW4/whats-the-difference-between-dependencies-devdependencies-and-peerdependencies?lang=zh_CN&from=csdn

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: package.json 用于描述一个 JavaScript 包,其包括包的依赖,脚本,作者和其他信息。它的配置包括:name:包的的名称;version:包的版本号;description:包的描述;main:包的入口文件;scripts:包的脚本;author:作者的名称;license:协议名称;dependencies依赖的包;devDependencies:开发依赖的包。 ### 回答2: package.jsonNode.js目的配置文件,用于定义目相关的信息和依赖关系。下面是package.json常见的配置以及对应的说明: 1. name: 目名称,必须是唯一的字符串。 2. version: 目版本号,遵循语义化版本规范。 3. description: 目描述,简要说明目的功能和特点。 4. main: 入口文件(通常是index.js),指定了目的主要入口。 5. scripts: 脚本命令,用于定义各种目相关的脚本。比如启动目、构建、测试等。 6. author: 目作者的姓名或者用户名。 7. license: 目所采用的开源许可证类型。 8. repository: 目的代码仓库信息,可以是远程仓库地址或者一个对象。 9. keywords: 目的关键字,用于方便搜索和分类。 10. dependencies: 目的生产环境依赖包列表,存放所需的正式环境依赖。 11. devDependencies: 目的开发环境依赖包列表,存放所需的开发环境依赖。 12. peerDependencies: 目的对等依赖包列表,用于约束目在运行时需要的模块版本。 13. engines: 定义该目所支持的Node.js版本范围。 14. private: 一个布尔值,指示该目是否是私有的,如果是私有的则无法发布到公共的npm仓库。 15. scripts: 自定义脚本命令,可以在package.json定义和使用。 以上是package.json常见的配置和对应的说明,通过配置这些,可以更好地描述和管理Node.js目。 ### 回答3: package.json是一个用于描述和定义Node.js依赖关系和脚本命令的配置文件。下面是常见的package.json的配置及其代码说明: 1. name: 目的名称 ``` "name": "my-project" ``` 2. version: 目的版本号 ``` "version": "1.0.0" ``` 3. description: 目的描述信息 ``` "description": "这是一个Node.js目" ``` 4. main: 入口文件 ``` "main": "index.js" ``` 5. scripts: 定义可执行的脚本命令 ``` "scripts": { "start": "node index.js", "test": "mocha test.js" } ``` 6. keywords: 目的关键字,用于搜索和分类 ``` "keywords": [ "Node.js", "目" ] ``` 7. author: 目的作者 ``` "author": "John Doe" ``` 8. license: 目的许可证 ``` "license": "MIT" ``` 9. dependencies: 生产环境依赖的包 ``` "dependencies": { "express": "^4.17.1", "lodash": "^4.17.21" } ``` 10. devDependencies: 开发环境依赖的包 ``` "devDependencies": { "mocha": "^9.1.1", "chai": "^4.3.4" } ``` 11. peerDependencies: 目所需要的对等依赖的包 ``` "peerDependencies": { "react": "^17.0.2" } ``` 12. repository: 目的代码仓库信息 ``` "repository": { "type": "git", "url": "https://github.com/username/my-project.git" } ``` 13. bugs: 提供反馈和报告问题的链接 ``` "bugs": { "url": "https://github.com/username/my-project/issues" } ``` 14. homepage: 目的主页链接 ``` "homepage": "https://github.com/username/my-project" ``` 以上是常见的package.json的配置及其代码说明。根据实际需求,可以对这些配置进行相应的修改和添加。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值