【问题标题】:Why does npm install modules locally by default?为什么 npm 默认会在本地安装模块?
【发布时间】:2014-10-16 13:54:40
【问题描述】:

我是 Node/Angular 世界的新手(来自 Ruby),我只是想知道...

为什么 npm 默认会在项目本地安装模块?

我同时使用了 yeoman.io 和 mean.io 创建了两个独立的项目,在这两种情况下,它们最终都将一大堆文件夹添加到项目的 node_modules 目录中,用于 grunt 和 karma 和 express 等等东西。我知道您可以将文件夹添加到 .gitignore,但这并不能改变您的计算机上可能会有一大堆相同库的重复实例的事实。

为什么默认将包添加到本地项目目录?有没有办法强制 npm 默认全局安装而不是本地安装?

注意:在 Ruby 世界中,gem(相当于npm)通过自动生成“锁定文件”来跟踪安装了哪个特定版本。这允许人们完全控制每个项目的依赖版本。我开始怀疑 npm 不全局安装的唯一原因是否是因为它没有“锁定文件”来跟踪应用程序正在使用哪些特定的子版本。

【问题讨论】:

  • 请注意,npm 没有具有特定应用程序版本的锁定文件,但 package.json 能够设置特定或与 semver 兼容的版本,如果 lib 遵循 semver,则允许自动升级.

标签: node.js angularjs npm


【解决方案1】:

在开发 npm 的早期,有很多关于这个的讨论。人们希望避免他们在使用 Ruby、Perl 等时遇到的版本不兼容问题。最终决定最简单的解决方案是根本没有全局库路径,而是让每个应用程序都有自己的库路径。

这种策略其实并不新鲜。许多 Ruby、Perl 和 Python 的企业/任务关键型安装使用自定义编译的解释器和自定义库路径。长期以来,标准建议一直是,如果您真的不希望客户或操作系统发行版意外破坏您的应用程序,最可靠的技术是不使用标准安装库。

Npm 将此作为默认配置。当人们问“为什么?”时,开发人员回答说这是最简单的解决方案,而传统的做事方式在当今廉价的 TB 级硬盘世界中没有优势。

我个人不会改变 npm 的默认工作方式,即使我最初是支持共享库实现的人之一。 Node 模块的作者假定默认配置是您所拥有的,因此不怕对其 API 进行重大更改。

【讨论】:

  • 哇,很高兴知道。这完全回答了这个问题。谢谢!
  • 嗯,Maven (Java) 将不同版本的库存储在用户机器上的同一目录中,因此在多个项目中使用相同版本的给定库不会导致多个目录包含该库的代码。确实,现在磁盘空间很便宜,但仍然..
  • @JohnDonn:Maven 可以,但 Java 通常也会为每个应用安装一个库。我不是在谈论开发库。我说的是编译库,Java 通常包含 jar 中的所有库。类似于 node.js 的做法
猜你喜欢
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 2016-03-27
  • 2018-07-13
相关资源
最近更新 更多