# npm install

安装包

# 概要

npm install [<package-spec> ...]

aliases: add, i, in, ins, inst, insta, instal, isnt, isnta, isntal, isntall

# 描述

这个命令安装一个包以及它所依赖的任何包。如果包有一个 package-lock,或一个 npm shrinkwrap 文件,或一个 yarn lock 文件,依赖项的安装将由该文件驱动,遵循以下优先顺序:

  • npm-shrinkwrap.json
  • package-lock.json
  • yarn.lock

详见 package-lock.jsonnpm shrinkwrap.

一个 package 是:

  • a) 包含 package.json 文件描述的程序的文件夹
  • b) 一个 gzip 压缩包文件,包含 (a)
  • c) 解析为 (b) 的url
  • d) 在注册中心(详见 registry)上发布的 <name>@<version>,带有 (c)
  • e) 指向 (d) 的 <name>@<tag>(详见 npm dist-tag)
  • f) 有 "latest" 标签的 <name> 满足 (e)
  • g) 解析为 (a) 的 <git remote url>

即使你从来没有发布过你的包,如果你只是想写一个节点程序 (a),或者如果你想在打包成 tarball 之后在其他地方轻松安装它 (b),你仍然可以使用 npm 获得很多好处。

  • npm install(在包目录中,没有参数)

将依赖项安装到本地 node_modules 文件夹。

在全局模式( 即在命令后加上 -g--global )中,它将当前包上下文( 即当前工作目录 )安装为全局包。

默认情况下,npm install 将安装 package.json 中列出的所有依赖项模块。

有了 --production 标志 ( 或当 NODE_ENV 环境变量设置为 production 时 ), npm 将不会安装列出在 devDependencies 中的模块。当 NODE_ENV 环境变量设置为 production 时,要安装 dependenciesdevDependencies 中列出的所有模块,你可以使用 --production=false

注意

在向项目添加依赖项时,--production 标志没有特别的含义。

  • npm install <folder>

如果 <folder> 位于项目的根目录中,那么它的依赖项将被安装,并可能像其他类型的依赖项一样被提升到顶级 node_modules。如果 <folder> 位于项目的根目录之外,npm 不会将包依赖项安装在 <folder> 目录中,但它会创建一个指向 <folder> 的符号链接。

注意

如果您想从注册中心安装目录的内容(如包)而不是创建链接,则需要使用 --install-links 选项。

# 例子

npm install ../../other-package --install-links
npm install ./sub-package
  • npm install <tarball file>

安装位于文件系统上的包。注意:如果你只是想把一个 dev 目录链接到你的 npm 根目录,你可以使用 npm link 更容易地做到这一点。

压缩包要求: 1)文件名必须使用 .tar.tar.gz.tgz 作为扩展名。 2)包内容应该位于 tarball (通常被称为 package/) 中的子文件夹中。 3)包必须包含一个具有 nameversion 属性的 package.json 文件。

例子:

npm install ./package.tgz
  • npm install <tarball url>

获取 tarball url,然后安装它。为了区分这个和其他选项,参数必须以 "http://" 或 "https://" 开头。

例子:

npm install https://github.com/indexzero/forever/tarball/v0.5.6
  • npm install [<@scope>/]<name>

进行 <name>@<tag> 安装,其中 <tag> 是 "tag" 配置。(详见 config,该配置的默认值为 latest)

在大多数情况下,这将安装在 npm 注册表中标记为 latest 的模块版本。

例子:

npm install sax

npm install 默认将任何指定的包保存到 dependencies 中。另外,你可以通过一些附加标志来控制它们的保存位置和方式:

1)-P, --save-prod: 包会出现在你的 dependencies 中. 这是默认设置,除非 -D-O 存在。

2)-D, --save-dev: 包会出现在你的 devDependencies 中。

3)-O, --save-optional: 包会出现在你的 optionalDependencies 中。

4)--no-save: 防止保存到 dependencies

当使用上述任何选项将依赖项保存到 package.json 时,还有两个额外的可选标志:

1)-E, --save-exact: 保存的依赖项将使用精确的版本进行配置,而不是使用 npm 的默认 semver 范围运算符。

2)-B, --save-bundle: 保存的依赖项也将添加到您的 bundleDependencies 列表中。

此外,如果您有 npm-shrinkwrap.jsonpackage-lock.json 那么它也会被更新。

<scope> 是可选的。包将从与指定范围关联的注册中心中下载。如果注册中心没有与给定范围关联,则假定默认的注册中心。详见 scope。

注意

如果你的范围名称中没有包含 @-symbol,npm 会将其解释为 GitHub 存储库,见下文。范围名称后还必须跟一个斜杠。

例子

npm install sax
npm install githubname/reponame
npm install @myorg/privatepackage
npm install node-tap --save-dev
npm install dtrace-provider --save-optional
npm install readable-stream --save-exact
npm install ansi-regex --save-bundle

如果当前工作目录中有一个名为 <name> 的文件或文件夹,那么它将尝试安装该文件或文件夹,并且只有在包无效时才尝试通过名称获取包。

  • npm install <alias>@npm:<name>

在自定义别名下安装包。允许并排同名包的多个版本,更方便地导入具有其他长包的名称,并使用 git forks 替换或分叉的 npm 包作为替换。别名仅适用于您的项目,不会重命名传递依赖项中的包。别名应遵循 validate-npm-package-name

例子:

npm install my-react@npm:react
npm install jquery2@npm:jquery@2
npm install jquery3@npm:jquery@3
npm install npa@npm:npm-package-arg
  • npm install [<@scope>/]<name>@<tag>

安装指定标签引用的包版本。如果该包的注册中心数据中不存在该标记,则此操作将失败。

例子:

npm install sax@latest
npm install @myorg/mypackage@latest
  • npm install [<@scope>/]<name>@<version>

安装指定版本的软件包。如果版本没有发布到注册中心,则此操作将失败。

例子:

npm install sax@0.1.1 
npm install @myorg/privatepackage@1.5.0 
  • npm install [<@scope>/]<name>@<version range>

安装与指定版本范围匹配的软件包版本。这将遵循在 package.json 中描述的解析依赖关系的相同规则。

请注意,大多数版本范围必须放在引号中,以便您的 shell 将其视为单个参数。

例子:

npm install sax@ ">=0.1.0 <0.2.0" 
npm install @myorg/privatepackage@ "16 - 17" 
  • npm install <git remote url>

从托管的 git 提供程序安装包,用 git 克隆它。对于完整的 git 远程 url,只会尝试该 url。

<protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish> | #semver:<semver>]

<protocol>git, git+ssh, git+http, git+https,或者 git+file 中的一个。

如果 #<commit-ish> 提供,它将用于准确克隆该提交。如果 commit-ish 的格式为 #semver:<semver>,<semver> 可以是任何有效的 semver 范围或确切版本,npm 将在远程存储库中查找与该范围匹配的任何标签或引用,就像它查找注册表依赖项一样。如果两者均未指定 #<commit-ish> 或未 #semver:<semver> 指定,则使用存储库的默认分支。

如果存储库使用子模块,这些子模块也将被克隆。

如果正在安装的包包含一个 prepare 脚本,则在打包和安装包之前,将安装它 dependenciesdevDependencies 并且运行准备脚本。

以下 git 环境变量被 npm 识别,并在运行 git 时添加到环境中:

  • GIT_ASKPASS

  • GIT_EXEC_PATH

  • GIT_PROXY_COMMAND

  • GIT_SSH

  • GIT_SSH_COMMAND

  • GIT_SSL_CAINFO

  • GIT_SSL_NO_VERIFY

有关详细信息,请参阅 git 手册页。

例子:

npm install git+ssh://git@github.com:npm/cli.git#v1.0.27
npm install git+ssh://git@github.com:npm/cli#pull/273
npm install git+ssh://git@github.com:npm/cli#semver:^5.0
npm install git+https://isaacs@github.com/npm/cli.git
npm install git://github.com/npm/cli.git#v1.0.27

GIT_SSH_COMMAND='ssh -i ~/.ssh/custom_ident' npm install git+ssh://git@github.com:npm/cli.git
  • npm install <githubname>/<githubrepo>[#<commit-ish>]
  • npm install github:<githubname>/<githubrepo>[#<commit-ish>]

https://github.com/githubname/githubrepo 安装该包,尝试使用 git 克隆它。

如果 #<commit-ish> 提供,它将用于准确克隆该提交。如果 commit-ish 的格式为 #semver:<semver>,<semver> 可以是任何有效的 semver 范围或确切版本,npm 将在远程存储库中查找与该范围匹配的任何标签或引用,就像它查找注册中心依赖项一样。如果没有指定 #<commit-ish>#semver:<semver>,则使用默认分支。

与常规 git 依赖一样,如果包在安装之前有一个 prepare 脚本,dependenciesdevDependencies 将被安装。

例子:

npm install mygithubuser/myproject
npm install github:mygithubuser/myproject
  • npm install gist:[<githubname>/]<gistID>[#<commit-ish>|#semver:<semver>]

https://gist.github.com/gistID 安装该包,尝试使用 git 克隆它。与 gist 关联的 GitHub 用户名是可选的,不会保存在 package.json 中。

与常规 git 依赖一样,如果包在安装之前有一个 prepare 脚本,dependenciesdevDependencies 将被安装。

例子:

npm install gist:101a11beef
  • npm install bitbucket:<bitbucketname>/<bitbucketrepo>[#<commit-ish>]

https://bitbucket.org/bitbucketname/bitbucketrepo 安装该包,尝试使用 git 克隆它。

如果 #<commit-ish> 提供,它将用于准确克隆该提交。如果 commit-ish 的格式为 #semver:<semver>,<semver> 可以是任何有效的 semver 范围或确切版本,npm 将在远程存储库中查找与该范围匹配的任何标签或引用,就像它查找注册中心依赖项一样。如果没有指定 #<commit-ish>#semver:<semver>,然后使用 master

与常规 git 依赖一样,如果包在安装之前有一个 prepare 脚本,dependenciesdevDependencies 将被安装。

npm install bitbucket:mybitbucketuser/myproject
  • npm install gitlab:<gitlabname>/<gitlabrepo>[#<commit-ish>]

https://gitlab.com/gitlabname/gitlabrepo 安装该包,尝试使用 git 克隆它。

如果 #<commit-ish> 提供,它将用于准确克隆该提交。如果 commit-ish 的格式为 #semver:<semver>,<semver> 可以是任何有效的 semver 范围或确切版本,npm 将在远程存储库中查找与该范围匹配的任何标签或引用,就像它查找注册中心依赖项一样。如果没有指定 #<commit-ish>#semver:<semver>,然后使用 master

例子:

npm install gitlab:mygitlabuser/myproject
npm install gitlab:myusr/myproj#semver:^5.0

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

npm install sax@">=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

# 配置

详见 config 帮助文档,许多配置参数对安装有一些影响,因为这是 npm 所做的大部分工作。

这些是与安装相关的一些最常见的选项。

# save

  • Default: true 除非在使用 npm update 时默认为 false
  • Type: Boolean

将已安装的软件包保存为 package.json 文件作为依赖项。

npm rm 命令一起使用时,从 package.json 移除依赖关系。

如果设置为 package.json,也将阻止写入 false

# save-exact

  • Default: false
  • Type: Boolean

保存到 package.json 的依赖项将使用精确的版本进行配置,而不是使用 npm 的默认 semver 范围运算符。

# global

  • Default: false
  • Type: Boolean

以 “global” 模式运行,会将包安装到 prefix 文件夹而不是当前工作目录中。有关行为差异的更多信息,请参阅 folders。

  • 软件包被安装到 {prefix}/lib/node_modules 文件夹中,而不是当前工作目录中。
  • bin 文件链接到 {prefix}/bin
  • 操作说明链接到 {prefix}/share/man

# global-style

  • Default: false
  • Type: Boolean

使 npm 以与全局 node_modules 文件夹相同的布局将包安装到本地 node_modules 文件夹。您的直接依赖项将在 node_modules 中显示,它们所依赖的一切将在其 node_modules 文件夹中扁平化。这显然会消除一些重复数据删除。如果与 legacy-bundling 一起使用,legacy-bundling 优先。

# legacy-bundling

  • Default: false
  • Type: Boolean

使 npm 安装包,以便 1.4 之前的 npm 版本(例如 node 0.8 中包含的版本)可以安装包。这消除了所有自动重复数据删除。如果与 global-style 此选项一起使用 legacy-bundling 将是首选。

# omit

  • Default: 'dev' | ''
  • Type: "dev", "optional", or "peer" (可以设置多次)

要从磁盘上的安装树中省略的依赖类型。

注意

这些依赖项仍然被解析并添加到 package-lock.jsonnpm-shrinkwrap.json 文件中。

如果包类型同时出现在 --include--omit 列表中,那么它将被包括在内。

如果结果省略列表包括 dev,则 NODE_ENV 环境变量将设置 production 为所有生命周期的脚本。

# strict-peer-deps

  • Default: false
  • Type: Boolean

如果设置为 true ,并且没有设置 --legacy-peer-deps,则任何冲突 peerDependencies 都将被视为安装失败,即使 npm 可以根据非对等依赖关系合理地猜测适当的解决方案。

默认情况下,peerDependencies 将使用最近的非对等依赖规范来解决依赖关系图中的冲突,即使这样做会导致某些包收到超出其包 peerDependencies 对象中设置的范围的对等依赖项。

当执行此类和覆盖时,将打印一个警告,解释冲突和涉及的包。如果设置了 --strict-peer-deps,则此警告将被视为失败。

# package-lock

  • Default: true
  • Type: Boolean

如果设置为 false,则在安装时忽略 package-lock.json 文件。如果 save 为 true,将阻止写入 package-lock.json

此配置不会影响 npm ci

# foreground-scripts

  • Default: false
  • Type: Boolean

在前台进程中运行已安装包的所有构建脚本(ie, preinstall, install, postinstall) ,将与主 npm 进程共享标准输入、输出和错误。

注意

这通常会使安装运行速度变慢,并且噪音更大,但对调试很有用。

# ignore-scripts

  • Default: false
  • Type: Boolean

如果为 true, npm 不会运行包中指定的 package.json 文件。

注意

如果设置了 ignore-scripts,那些显式地想要运行特定脚本的命令,比如 npm startnpm stopnpm restartnpm testnpm run-script 仍然会运行它们想要运行的脚本,但是它们不会运行任何前脚本或后脚本。

# audit

  • Default: true
  • Type: Boolean

当为 "true" 时,将检查报告和当前 npm 命令一起提交到默认注册中心和所有配置了作用域的注册中心。具体提交内容请参见 npm audit 文档。

  • Default: true
  • Type: Boolean

告诉 npm 为包可执行文件创建符号链接(或 Windows 上的 .cmd 连接器命令文件)。

设置为 false 使其不执行此操作。这可以用来解决某些文件系统不支持符号链接的事实,即使在表面上是 Unix 系统上也是如此。

# fund

  • Default: true
  • Type: Boolean

当为 “true” 时,在每个 npm install 的末尾显示一条消息,确认寻求资助的依赖关系的数量。详见 npm fund

# dry-run

  • Default: false
  • Type: Boolean

表示您不希望 npm 进行任何更改,并且只报告它应该做的事情。这可以传递到任何修改本地安装的命令中,例如:install, update, dedupe, uninstall 以及 pack 和 publish。

注意

其他相关命令不支持此功能,例如 dist-tags, owner 等。

# workspace

  • Default:
  • Type: String (可以设置多次)

启用在当前项目的已配置工作区的上下文中运行命令,同时通过仅运行此配置选项定义的工作区进行过滤。

workspace 配置的有效值如下:

  • 工作区名称
  • 工作区目录的路径
  • 父工作区目录的路径(将导致选择该文件夹中的所有工作区)

npm init 命令设置时,可以将其设置为尚不存在的工作空间的文件夹,以创建文件夹并将其设置为项目中的全新工作空间。

此值不会导出到子进程的环境中。

# workspaces

  • Default: null
  • Type: null or Boolean

设置为 true 将在所有配置的工作区中运行该命令。

显式地将此设置为 false 将导致如下命令 install 完全忽略工作空间。当没有显式设置时:

  • node_modules 树上操作的命令 (install, update, etc.) 时,将把工作区链接到 node_modules 文件夹中。做其他事情的命令 (test, exec, publish, etc.) 将在根项目上操作,除非在 workspace 配置中指定了一个或多个工作空间。

此值不会导出到子进程的环境中。

# include-workspace-root

  • Default: false
  • Type: Boolean

当为某个命令启用工作区时,请包含工作区根目录。

当为 false 时,通过 workspace 配置指定单个工作空间,或通过 workspaces 标志指定所有工作空间,将导致 npm 仅在指定的工作空间上运行,而不是在根项目上运行。

此值不会导出到子进程的环境中。

  • Default: false
  • Type: Boolean

当设置文件: 存在于项目根目录之外的协议依赖项将被打包并安装为常规依赖项,而不是创建符号链接。此选项对工作区没有影响。

# 算法

给定一个 package{dep} 结构:A{B,C}, B{C}, C{D},npm install 算法产生:

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

也就是说,B 对 C 的依赖满足于这样一个事实: A 已经导致 C 被安装在更高的级别上。D 仍然安装在顶层,因为没有什么与它冲突。

对于 A{B,C}, B{C,D@1}, C{D@2},该算法产生:

A
+-- B
+-- C
   `-- D@2
+-- D@1

因为 B 的 D@1 会安装在顶层,所以 C 现在必须为自己私下安装 D@2。该算法是确定性的,但如果请求以不同顺序安装两个依赖项,则可能会生成不同的树。

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

Last Updated: 4/25/2023, 9:49:29 AM