npm-install

安装包

选择 CLI 版本

概述

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

一个

  • a) 包含由 package.json 文件描述的程序的文件夹
  • b) 包含 (a) 的 gzip 压缩的 tar 包
  • c) 解析为 (b) 的 URL
  • d) 发布在注册表 (请参阅 registry) 上的 <name>@<version>,具有 (c)
  • e) 指向 (d) 的 <name>@<tag> (请参阅 npm dist-tag)
  • f) 具有满足 (e) 的“latest”标签的 <name>
  • g) 解析为 (a) 的 <git remote url>

即使您从未发布过您的包,只要您只想编写一个 Node 程序 (a),或者也许您还希望能够在将程序打包到 tar 包 (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>:

    安装位于文件系统上的包。注意:如果您只想将开发目录链接到 npm 根目录,可以使用 npm link 更轻松地执行此操作。

    Tar 包要求

    • 文件名必须使用 .tar.tar.gz.tgz 作为扩展名。
    • 包内容应位于 tar 包内的子文件夹中 (通常称为 package/)。npm 在安装包时会剥离一层目录 (等效于运行 tar x --strip-components=1)。
    • 包必须包含具有 nameversion 属性的 package.json 文件。

    示例

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

    获取 tar 包 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 中。 此外,您可以使用一些额外的标志来控制它们在哪里以及如何保存。

    • -P, --save-prod:包将出现在您的 dependencies 中。 这是默认值,除非存在 -D-O

    • -D, --save-dev:包将出现在您的 devDependencies 中。

    • -O, --save-optional:包将出现在您的 optionalDependencies 中。

    • --no-save:阻止保存到 dependencies

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

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

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

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

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

    注意:如果您在范围名称中不包含 @ 符号,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 fork 替换或 fork 的 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 [email protected]
    npm install @myorg/[email protected]
  • 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>gitgit+sshgit+httpgit+httpsgit+file 中的一种。

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

    如果正在安装的包使用子模块,那么这些子模块也将被克隆。

    如果正在安装的包包含 prepare 脚本,则在打包和安装包之前,将安装其 dependenciesdevDependencies,并运行 prepare 脚本。

    以下 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://[email protected]:npm/cli.git#v1.0.27
    npm install git+ssh://[email protected]:npm/cli#pull/273
    npm install git+ssh://[email protected]:npm/cli#semver:^5.0
    npm install git+https://[email protected]/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://[email protected]:npm/cli.git
  • npm install <githubname>/<githubrepo>[#<commit-ish>]:

  • npm install github:<githubname>/<githubrepo>[#<commit-ish>]:

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

    如果提供 #<commit-ish>,它将用于准确克隆该提交。 如果提交-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>]:

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

    与常规 git 依赖项一样,如果包在安装完成之前具有 prepare 脚本,则将安装 dependenciesdevDependencies

    示例

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

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

    如果提供 #<commit-ish>,它将用于准确克隆该提交。 如果提交-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>]:

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

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

    与常规 git 依赖项一样,如果包在安装完成之前具有 prepare 脚本,则将安装 dependenciesdevDependencies

    示例

    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 所做的工作。

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

保存

  • 默认值:true,除非使用 npm update,在这种情况下,默认值为 false
  • 类型:布尔值

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

当与 npm rm 命令一起使用时,从 package.json 中删除依赖项。

如果设置为 false,还将阻止写入 package-lock.json

保存-精确

  • 默认值:false
  • 类型:布尔值

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

全局

  • 默认值:false
  • 类型:布尔值

在 "全局" 模式下运行,以便包安装到 prefix 文件夹中,而不是当前工作目录。 参见 folders,了解有关行为差异的更多信息。

  • 包安装到 {prefix}/lib/node_modules 文件夹中,而不是当前工作目录。
  • bin 文件链接到 {prefix}/bin
  • 手册页链接到 {prefix}/share/man

安装策略

  • 默认值:"hoisted"
  • 类型:"hoisted"、"nested"、"shallow" 或 "linked"

设置在 node_modules 中安装包的策略。 hoisted(默认):在顶层安装未重复的包,并在目录结构中按需重复安装。 nested:(以前为 --legacy-bundling)就地安装,不提升。 shallow:(以前为 --global-style)只在顶层安装直接依赖项。 linked:(实验性)在 node_modules/.store 中安装,就地链接,不提升。

传统捆绑

  • 默认值:false
  • 类型:布尔值
  • 已弃用:此选项已被 --install-strategy=nested 弃用。

不要在 node_modules 中提升包安装,而是以它们被依赖的方式安装包。 这可能会导致非常深的目录结构和重复的包安装,因为没有去重。 设置 --install-strategy=nested

全局样式

  • 默认值:false
  • 类型:布尔值
  • 已弃用:此选项已被 --install-strategy=shallow 弃用。

只在顶层 node_modules 中安装直接依赖项,但在更深层的依赖项上提升。 设置 --install-strategy=shallow

省略

  • 默认值:如果 NODE_ENV 环境变量设置为 'production',则为 'dev',否则为空。
  • 类型:"dev"、"optional" 或 "peer"(可以设置多次)

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

请注意,这些依赖项仍然会被解析并添加到 package-lock.jsonnpm-shrinkwrap.json 文件中。 它们只是没有实际安装到磁盘上。

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

如果最终的省略列表包含 'dev',那么对于所有生命周期脚本,NODE_ENV 环境变量将被设置为 'production'

包含

  • 默认
  • 类型:"prod"、"dev"、"optional" 或 "peer"(可以设置多次)

允许定义要安装的依赖项类型的选项。

这是 --omit=<type> 的反面。

--include 中指定的依赖项类型将不会被省略,无论在命令行中省略/包含的顺序如何。

严格对等依赖项

  • 默认值:false
  • 类型:布尔值

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

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

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

首选去重

  • 默认值:false
  • 类型:布尔值

如果可能,优先对包进行重复数据删除,而不是选择依赖项的较新版本。

package-lock

  • 默认值:true
  • 类型:布尔值

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

仅 package-lock

  • 默认值:false
  • 类型:布尔值

如果设置为 true,则当前操作将仅使用 package-lock.json,忽略 node_modules

对于 update,这意味着仅更新 package-lock.json,而不是检查 node_modules 并下载依赖项。

对于 list,这意味着输出将基于 package-lock.json 描述的树,而不是 node_modules 的内容。

前台脚本

  • 默认值:false,除非使用 npm packnpm publish,在这种情况下默认值为 true
  • 类型:布尔值

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

请注意,这通常会导致安装运行速度变慢,并且噪音更大,但对于调试可能很有用。

忽略脚本

  • 默认值:false
  • 类型:布尔值

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

请注意,明确用于运行特定脚本的命令(例如 npm startnpm stopnpm restartnpm testnpm run-script)如果设置了 ignore-scripts,仍将运行其预期脚本,但它们 *不会* 运行任何预脚本或后脚本。

审计

  • 默认值:true
  • 类型:布尔值

当 "true" 时,将审计报告与当前 npm 命令一起提交到默认注册表以及为作用域配置的所有注册表。有关提交内容的详细信息,请参阅 npm audit 的文档。

  • 默认值:true
  • 类型:布尔值

告诉 npm 为包可执行文件创建符号链接(或在 Windows 上创建 .cmd 垫片)。

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

基金

  • 默认值:true
  • 类型:布尔值

当 "true" 时,将在每个 npm install 结束时显示一条消息,确认正在寻找资金的依赖项数量。有关详细信息,请参阅 npm fund

试运行

  • 默认值:false
  • 类型:布尔值

表示您不希望 npm 进行任何更改,并且它应该只报告它将要执行的操作。这可以传递给任何修改本地安装的命令,例如 installupdatededupeuninstall,以及 packpublish

注意:这不会被其他与网络相关的命令(例如 dist-tagsowner 等)遵守。

CPU

  • 默认值:null
  • 类型:null 或 String

覆盖要安装的本机模块的 CPU 架构。可接受的值与 package.json 的 cpu 字段相同,该字段来自 process.arch

操作系统

  • 默认值:null
  • 类型:null 或 String

覆盖要安装的本机模块的操作系统。可接受的值与 package.json 的 os 字段相同,该字段来自 process.platform

libc

  • 默认值:null
  • 类型:null 或 String

覆盖要安装的本机模块的 libc。可接受的值与 package.json 的 libc 字段相同

工作区

  • 默认
  • 类型:String(可以设置多次)

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

对于 workspace 配置,有效值是

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

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

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

工作区

  • 默认值:null
  • 类型:null 或 Boolean

设置为 true 以在 **所有** 配置的工作空间的上下文中运行命令。

将此显式设置为 false 将导致像 install 这样的命令完全忽略工作空间。当未显式设置时

  • node_modules 树进行操作的命令(install、update 等)将链接工作空间到 node_modules 文件夹中。 - 执行其他操作的命令(test、exec、publish 等)将对根项目进行操作, *除非* 在 workspace 配置中指定了一个或多个工作空间。

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

包含工作区根目录

  • 默认值:false
  • 类型:布尔值

当为命令启用工作空间时,包括工作空间根目录。

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

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

  • 默认值:false
  • 类型:布尔值

当设置时,file: 协议依赖项将被打包并安装为常规依赖项,而不是创建符号链接。此选项对工作空间没有影响。

算法

给定一个 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 创建的特定文件夹结构的更详细说明,请参阅 文件夹

另请参阅