npm-install Install a package

SYNOPSIS

npm install (with no args, in package dir)
npm install [<@scope>/]<name>
npm install [<@scope>/]<name>@<tag>
npm install [<@scope>/]<name>@<version>
npm install [<@scope>/]<name>@<version range>
npm install <git-host>:<git-user>/<repo-name>
npm install <git repo url>
npm install <tarball file>
npm install <tarball url>
npm install <folder>

aliases: npm i, npm add
common options: [-P|--save-prod|-D|--save-dev|-O|--save-optional] [-E|--save-exact] [-B|--save-bundle] [--no-save] [--dry-run]

DESCRIPTION

此命令将安装软件包及其依赖的任何软件包. 如果程序包中有程序包锁定或rinklewrap文件,则依赖项的安装将由该程序驱动,如果两个文件都存在,则以npm-shrinkwrap.json为准. 请参阅package-lock.jsonnpm- shrinkwrap .

A package is:

即使您从未发布过软件包,如果您只想编写一个节点程序(a),或者如果您还希望能够在打包后将其轻松安装到其他地方,使用npm仍然可以获得很多好处.放入压缩档(b).

您可以组合多个参数,甚至多种类型的参数. 例如:

npm install [email protected]">=0.1.0 <0.2.0" bench supervisor

--tag参数将应用于所有指定的安装目标. 如果存在具有给定名称的标签,则带标签的版本优先于较新的版本.

--dry-run参数将以通常的方式报告安装操作,而无需实际安装任何内容.

--package-lock-only参数仅更新package-lock.json ,而不检查node_modules并下载依赖项.

-f--force参数将强制npm获取远程资源,即使磁盘上存在本地副本也是如此.

npm install sax --force

-g--global参数将使npm在全局而非本地安装软件包. 参见npm-folders .

--global-style参数将使npm以与全局node_modules文件夹相同的布局将软件包安装到本地node_modules文件夹中. 只有直接依赖项将显示在node_modules而它们依赖的所有内容都将在其node_modules文件夹中展平. 显然,这将消除一些重复数据删除.

--ignore-scripts参数将导致npm不执行package.json中定义的任何脚本. 参见npm-scripts .

--legacy-bundling参数将导致npm安装该软件包,以使1.4之前的npm版本(例如节点0.8附带的版本)可以安装该软件包. 这消除了所有自动重复数据删除.

--link参数将导致npm在某些情况下将全局安装链接到本地​​空间.

--no-bin-links参数将阻止npm为软件包可能包含的任何二进制文件创建符号链接.

--no-optional参数将防止安装可选的依赖项.

--no-shrinkwrap参数,它将忽略可用的软件包锁定或收缩包装文件,而改用package.json.

--no-package-lock参数将阻止npm创建package-lock.json文件. 在禁用包锁的情况下运行时,npm不会在安装时自动修剪节点模块.

--nodedir=/path/to/node/source参数将允许npm查找节点源代码,以便npm可以编译本机模块.

--only={prod[uction]|dev[elopment]}参数将导致仅安装devDependencies或仅安装非devDependencies ,而与NODE_ENV .

--no-audit参数可用于禁用将审核报告发送到已配置的注册表. 有关发送内容的详细信息,请参见npm-audit .

参见npm-config . 许多配置参数都会对安装产生影响,因为这是npm的大部分工作.

ALGORITHM

要安装软件包,npm使用以下算法:

load the existing node_modules tree from disk
clone the tree
fetch the package.json and assorted metadata and add it to the clone
walk the clone and add any missing dependencies
  dependencies will be added as close to the top as is possible
  without breaking any other modules
compare the original tree with the cloned tree and make a list of
actions to take to convert one to the other
execute all of the actions, deepest first
  kinds of actions are install, update, remove and move

对于此package{dep}结构: A{B,C}, B{C}, C{D} ,此算法产生:

A
+-- B
+-- C
+-- D

即,通过A已经使C被安装在更高级别的事实,满足了从B到C的依赖性. D仍安装在顶层,因为没有冲突.

For A{B,C}, B{C,[email protected]}, C{[email protected]}, this algorithm produces:

A
+-- B
+-- C
   `-- [email protected]
+-- [email protected]

由于B的[受电子邮件保护]将安装在顶层,因此C现在必须自行为其私人安装[受电子邮件保护] . 该算法是确定性的,但是如果请求以两个不同的顺序安装两个依赖项,则可能会生成不同的树.

有关npm创建的特定文件夹结构的详细说明,请参见npm-folders .

Limitations of npm’s Install Algorithm

npm将拒绝安装与当前软件包名称相同的任何软件包. 可以使用--force标志将其覆盖,但是在大多数情况下,可以通过更改本地软件包名称来解决.

在一些非常罕见的病理性极端情况下,循环可能导致npm尝试安装永无休止的软件包树. 这是最简单的情况:

A -> B -> A' -> B' -> A -> B -> A' -> B' -> A -> ...

其中A是软件包的某个版本,而A'是同一软件包的其他版本. 因为B依赖于A版本不同于树中已有的版本,所以它必须安装单独的副本. A'必须安装B'也是如此. 因为B'依赖于已被覆盖的A的原始版本,所以循环陷入无限回归.

为了避免这种情况,npm flat-out拒绝安装任何在包文件夹祖先树中任何位置已经存在的[email protected] . 一个更正确但更复杂的解决方案是将现有版本符号链接到新位置. 如果这影响了实际用例,将对其进行调查.

SEE ALSO


by  ICOPY.SITE