npm-folders Folder Structures Used by npm

DESCRIPTION

npm将各种东西放到您的计算机上. 那是它的工作.

该文档将告诉您放置在何处.

tl;dr

prefix Configuration

prefix config默认为节点安装的位置. 在大多数系统上,这是/usr/local . 在Windows上,它是%AppData%\npm . 在Unix系统上,它是上一层的,因为node通常安装在{prefix}/bin/node而不是{prefix}/node.exe .

设置global标志后,npm会将内容安装到该前缀中. 如果未设置,它将使用当前程序包的根目录,如果尚未在程序包中,则使用当前工作目录.

Node Modules

程序包将放在prefix下的node_modules文件夹中. 在本地安装时,这意味着您可以require("packagename")加载其主模块,或require("packagename/lib/path/to/sub/module")加载其他模块.

Global installs on Unix systems go to {prefix}/lib/node_modules. Global installs on Windows go to {prefix}/node_modules (that is, no lib folder.)

有作用域的软件包以相同的方式安装,只不过它们在相关的node_modules文件夹的子文件夹中分组在一起,该子文件夹的作用域名称以@符号表示,例如npm install @myorg/package会将npm install @myorg/package放置在{prefix}/node_modules/@myorg/package . 请参阅scope以获取更多详细信息.

如果您require()软件包,请在本地安装.

Executables

在全局模式下,可执行文件在Unix上链接到{prefix}/bin ,在Windows上直接链接到{prefix} .

在本地模式下,可执行文件链接到./node_modules/.bin ,因此可以将其提供给通过npm运行的脚本使用. (例如,当您运行npm test时, npm test运行npm test将位于路径中.)

Man Pages

在全局模式下,手册页链接到{prefix}/share/man .

在本地模式下,未安装手册页.

手册页未安装在Windows系统上.

Cache

请参阅npm-cache . 缓存文件存储在Posix上的~/.npm中,或Windows上的%AppData%/npm-cache中.

这由cache配置参数控制.

Temp Files

默认情况下,临时文件存储在tmp config指定的文件夹中,该文件夹默认为TMPDIR,TMP或TEMP环境变量,在Unix上默认为/tmp ,在Windows上默认为c:\windows\temp .

临时文件在该根目录下为程序的每次运行提供一个唯一的文件夹,并在成功退出后被删除.

More Information

在本地安装时,npm首先尝试找到合适的prefix文件夹. 这样,即使您碰巧将cd到其他文件夹中, npm install [email protected]也会安装到软件包的明智根目录.

从$ PWD开始,npm将沿着文件夹树移动,检查包含package.json文件或node_modules文件夹的文件夹. 如果找到这样的东西,则出于运行npm命令的目的,该目录将被视为有效的"当前目录". (此行为是受在工作目录中运行git命令时git的.git-folder寻找逻辑的启发和相似的.)

如果找不到软件包根目录,则使用当前文件夹.

当您运行npm install [email protected] ,程序包将加载到缓存中,然后解压缩到./node_modules/foo . 然后,将任何foo的依赖项类似地解压缩到./node_modules/foo/node_modules/... .

任何bin文件都./node_modules/.bin/链接到./node_modules/.bin/ ,以便在必要时npm脚本可以找到它们.

Global Installation

如果global配置设置为true,则npm将"全局"安装软件包.

对于全局安装,软件包的安装方式大致相同,但是使用上述文件夹.

Cycles, Conflicts, and Folder Parsimony

循环使用节点模块系统的属性来处理,该属性会在目录中查找node_modules文件夹. 因此,在每个阶段,如果某个软件包已经安装在祖先的node_modules文件夹中,则不会在当前位置安装该软件包.

考虑上面的情况,其中foo -> bar -> baz . 想象一下,除此之外,baz是否依赖于bar,因此您将拥有: foo -> bar -> baz -> bar -> baz ... 但是,由于文件夹结构为: foo/node_modules/bar/node_modules/baz ,因此无需将bar的另一个副本放入.../baz/node_modules ,因为当它调用require(" bar")时,它将得到安装在foo/node_modules/bar的副本.

仅当在多个嵌套的node_modules文件夹中安装完全相同的版本时,才使用此快捷方式. 如果两个" a"软件包的版本不同,仍然可以使用a/node_modules/b/node_modules/a . 但是,无需多次重复完全相同的程序包,就始终可以防止无限回归.

可以通过在本地化的"目标"文件夹下尽可能高的级别安装依赖项来进行另一项优化.

Example

考虑以下依赖关系图:

在这种情况下,我们可能期望这样的文件夹结构:

foo
+-- node_modules
    +-- blerg (1.2.5) <---[A]
    +-- bar (1.2.3) <---[B]
    |   `-- node_modules
    |       +-- baz (2.0.2) <---[C]
    |       |   `-- node_modules
    |       |       `-- quux (3.2.0)
    |       `-- asdf (2.3.4)
    `-- baz (1.2.3) <---[D]
        `-- node_modules
            `-- quux (3.2.0) <---[E]

由于foo直接依赖于[email protected][email protected] ,因此它们将安装在foo的node_modules文件夹中.

即使blerg的最新副本是1.3.7,foo仍对版本1.2.5有特定的依赖性. 因此,该安装在[A]. 由于blerg的父安装满足bar对[email protected]的依赖性,因此不会在[B]下安装另一个副本.

Bar [B]也依赖baz和asdf,因此它们安装在bar的node_modules文件夹中. 因为它取决于[email protected] ,所以它不能重复使用安装在父node_modules文件夹[D]中的[email protected] ],而必须安装自己的副本[C].

在酒吧下面, baz -> quux -> bar依赖关系创建了一个循环. 但是,由于bar已经在quux的祖先[B]中,因此它不会将bar的另一个副本解压缩到该文件夹​​中.

foo -> baz [D]下,quux的[E]文件夹树为空,因为它对bar的依赖关系由安装在[B]的父文件夹副本满足.

有关安装位置的图形分类,请使用npm ls .

Publishing

发布后,npm将在node_modules文件夹中查找. 如果bundledDependencies数组中没有任何项,那么它们将不包含在包tarball中.

这允许软件包维护者在本地安装其所有依赖项(和开发依赖项),而仅重新发布在其他地方找不到的那些项. 有关更多信息,请参见package.json .

SEE ALSO


by  ICOPY.SITE