npm install
概要:
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 <alias>@npm:<name>
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]
描述
此命令将安装软件包及其依赖的任何软件包。如果程序包中有 package-lock 或shrinkwrap(收缩包装) 文件,则依赖项的安装将由该程序驱动,如果两个文件都存在,则以npm-shrinkwrap.json为准。请参阅package-lock.json和npm收缩包装。
一个包是:
- a) 包含package.json文件描述的程序的文件夹
- b) 包含package.json文件描述的压缩包
- c) 解析为(b)的网址
- d) 在(c)的注册表中发布的<name> @ <version>(see
registry
) - e) 指向(d)的 <name>@<tag>(see
npm dist-tag
) - f) 具有满足(e)以下条件的“latest”标签的<name>
- g) 解析为(a)的<git remote url>
即使您从未发布过软件包,如果您只想编写一个节点程序(a),或者如果您还希望能够在打包后将其轻松安装到其他地方,使用npm仍然可以获得很多好处。放入压缩档(b)。
* npm install
- 在软件包目录中,无参数
将依赖项安装在本地node_modules文件夹中。
在全局模式下(即,在命令后附加-g或--global),它将当前程序包上下文(即当前工作目录)安装为全局程序包。
默认情况下,npm install将安装所有列为package.json中的依赖项的模块。
使用--production标志(或将NODE_ENV环境变量设置为production时),npm将不会安装devDependencies中列出的模块。
要在NODE_ENV环境变量设置为production时安装dependencies和devDependencies中列出的所有模块,可以使用--production = false。
注意:--production标志在向项目添加依赖项时没有特殊含义。
* npm install <folder>
将软件包作为当前项目中的符号链接安装在目录中。它的依赖项将在链接之前安装。如果<folder>位于项目的根目录中,则其依赖关系可能会像其他类型的依赖关系一样被提升到顶级node_modules。
* npm install <tarball file>:
安装位于文件系统上的软件包。注意:如果仅要将dev目录链接到npm根目录,则可以使用npm link来更轻松地完成此操作。
Tarball要求:
- 文件名必须使用.tar,.tar.gz或.tgz作为扩展名。
- 软件包内容应驻留在tarball的子文件夹中(通常称为package/)。 npm在安装软件包时会剥离一个目录层(运行tar x --strip-components = 1等效)。
- 该软件包必须包含具有名称和版本属性的package.json文件。
Example:
npm install ./package.tgz
* npm install <tarall url>:
提取tarball网址,然后安装它。为了区分此选项和其他选项,参数必须以“ http://”或“ https://”开头
Example:
npm install https://github.com/indexzero/forever/tarball/v0.5.6
* npm install [<@scope>/]<name>
执行<name>@<tag>安装,其中<tag>是“ tag”配置。(请参阅配置。配置的默认值为latest。)
在大多数情况下,这将在npm注册表上安装标记为最新的模块版本。
Example:
npm install sax
* npm install <alias>@npm:<name>
在自定义别名下安装软件包。允许并排使用多个版本的同名程序包,对于其他名称较长的程序包,则可以使用更方便的导入名称,并使用git fork替换或派生的npm程序包作为替换。别名仅在您的项目上起作用,并且不会在传递性依赖项中重命名程序包。别名应遵循validate-npm-package-name中规定的命名约定。
Examples:
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 默认情况下将所有指定的包保存到依赖项中。此外,您可以使用一些其他标志来控制在何处以及如何保存它们:
- -P,--save-prod:包将出现在您的依赖项中。除非存在-D或-O,否则这是默认设置。
- -D,--save-dev:包将出现在您的devDependencies中。
- -O,--save-optional:包将出现在您的optionalDependencies中。
- --no-save:防止保存到依赖项。
使用上述任何选项将依赖项保存到package.json时,还有两个附加的可选标志:
- -E, --save-exact:保存的依赖项将配置为确切的版本,而不是使用npm的默认semver range运算符。
- -B, --save-bundle:保存的依赖项也将添加到您的bundleDependencies列表中。
此外,如果您有npm-shrinkwrap.json或package-lock.json,则也会对其进行更新。
<scope>是可选的。该包将从与指定范围关联的注册表中下载。如果没有注册表与给定范围相关联,则采用默认注册表。请参阅范围。
注意:如果您的作用域名称上未包含@ -symbol,则npm会将其解释为GitHub存储库,请参见下文。范围名称也必须后面加上斜杠。
Examples:
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 [<@scope>/]<name>@<tag>
安装指定标签引用的软件包的版本。如果该程序包的注册表数据中不存在该标记,则此操作将失败。
Example:
npm install sax@latest
npm install @myorg/mypackage@latest
* npm install [<@scope>/]<name>@<version>
安装指定版本的软件包。如果该版本尚未发布到注册表,则将失败。
Example:
npm install sax@0.1.1
npm install @myorg/privatepackage@1.5.0
* npm install [<@scope>/]<name>@<version range>
安装与指定版本范围匹配的软件包版本。这将遵循相同的规则来解决package.json中描述的依赖项。
请注意,大多数版本范围必须用引号引起来,以便您的外壳将其视为单个参数。
Example:
npm install sax@">=0.1.0 \<0.2.0"
npm install @myorg/privatepackage@">=0.1.0 \<0.2.0"
* 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
, or git+file
.
如果提供了 #<commit-ish>,它将用于精确克隆该提交。如果commit-ish的格式为#semver:<semver>,则<semver>可以是任何有效的semver范围或确切版本,并且npm会在远程存储库中查找与该范围匹配的任何标记或引用。注册表依赖项。如果未指定#<commit-ish>或#semver:<semver>,则使用存储库的默认分支。
如果存储库使用了子模块,那么这些子模块也将被克隆。
如果要安装的软件包包含prepare脚本,则在打包和安装软件包之前,将安装其dependencies和devDependencies,并运行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手册页。
Examples:
npm install git+ssh://git@github.com:npm/cli.git#v1.0.27
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>]
通过尝试使用git克隆该软件包,将其安装在https://github.com/githubname/githubrepo上。
如果提供了#<commit-ish>,它将用于精确克隆该提交。如果commit-ish的格式为#semver:<semver>,则<semver>可以是任何有效的semver范围或确切版本,然后npm会在远程存储库中查找与该范围匹配的任何标记或引用,就像对注册表依赖项一样。如果未指定 #<commit-ish>or
#semver:<semver>,则使用master。
与常规git依赖项一样,如果软件包具有prepare脚本,则将在软件包完成安装之前安装dependencies和devDependencies。
Examples:
npm install mygithubuser/myproject
npm install github:mygithubuser/myproject
* npm install gist:[<githubname>/]<gistID>[#<commit-iash>|#semver:<semver>]
通过尝试使用git克隆软件包,将其安装在https://gist.github.com/gistID上。与要点关联的GitHub用户名是可选的,不会保存在package.json中。
与常规git依赖项一样,如果软件包具有prepare脚本,则将在软件包完成安装之前安装dependencies和devDependencies。
Example:
npm install gist:101a11beef
* npm install bitbucket:<bitbucketname>/<bitbucketrepo>[#<commit-ish>]
通过尝试使用git克隆软件包,将其安装在https://bitbucket.org/bitbucketname/bitbucketrepo上。
如果提供了#<commit-ish>,它将用于精确克隆该提交。如果commit-ish的格式为#semver:<semver>,则<semver>可以是任何有效的semver范围或确切版本,并且npm会在远程存储库中查找与该范围匹配的任何标记或引用。注册表依赖项。如果未指定#<commit-ish>或#semver:<semver>,则使用master。
与常规git依赖项一样,如果软件包具有prepare脚本,则将在软件包完成安装之前安装dependencies和devDependencies。
Example:
npm install bitbucket:mybitbucketuser/myproject
* npm install gitlab:<gitlabname>/<gitlabrepo>[#<commit-ish>]
通过尝试使用git克隆软件包,将其安装在https://gitlab.com/gitlabname/gitlabrepo上。
如果提供了#<commit-ish>,它将用于精确克隆该提交。如果commit-ish的格式为#semver:<semver>,则<semver>可以是任何有效的semver范围或确切版本,并且npm会在远程存储库中查找与该范围匹配的任何标记或引用。注册表依赖项。如果未指定#<commit-ish>或#semver:<semver>,则使用master。
与常规git依赖项一样,如果软件包具有prepare脚本,则将在软件包完成安装之前安装dependencies和devDependencies。
Example:
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
--no-fund参数将隐藏每次安装结束时显示的消息,该消息确认正在寻找资金的依赖项的数量。见 npm-fund
-g或--global参数将使npm在全局而非本地安装软件包。See folders.
--global-style参数将使npm以与全局node_modules文件夹相同的布局将软件包安装到本地node_modules文件夹中。只有直接依赖项将显示在node_modules中,而它们依赖的所有内容都将在其node_modules文件夹中展平。显然,这将消除一些重复数据删除。
--ignore-scripts参数将导致npm不执行package.json中定义的任何脚本。See scripts
。
--legacy-bundling参数将导致npm安装该软件包,以使1.4之前的npm版本(例如节点0.8附带的版本)可以安装该软件包。这消除了所有自动重复数据删除。
--link参数将导致npm在某些情况下将全局安装链接到本地空间。
--no-bin-links参数将阻止npm为软件包可能包含的任何二进制文件创建符号链接。
--no-optional参数将防止安装可选依赖项。
--no-shrinkwrap参数,它将忽略可用的软件包锁定或收缩包装文件,而改用package.json。
> shrinkwrap(收缩包装)
--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。
See config
. 许多配置参数都会对安装产生影响,因为这是npm的大部分工作。
Algorthm(算法)
要安装软件包,npm使用以下算法:
从磁盘加载现有的node_modules树
克隆树
获取package.json和分类的元数据并将其添加到克隆中
遍历克隆并添加任何缺少的依赖项
依赖项将尽可能靠近顶部添加
不破坏任何其他模块
比较原始树和克隆树,并列出
将一个转换为另一个要采取的措施
执行所有动作,最深的优先
各种操作包括安装,更新,删除和移动
对于此 package{dep} 结构:A {B,C},B {C},C {D},该算法产生:
A
+-- B
+-- C
+-- D
即,通过A已经使C被安装在更高级别的事实,满足了从B到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创建的特定文件夹结构的详细说明,请参见文件夹。
npm安装算法的局限性
npm将拒绝安装与当前软件包名称相同的任何软件包。可以使用--force标志将其覆盖,但是在大多数情况下,可以通过更改本地软件包名称来解决。
在一些非常罕见的病理性极端情况下,循环可能导致npm尝试安装永无休止的软件包树。这是最简单的情况:
A -> B -> A' -> B' -> A -> B -> A' -> B' -> A -> ...
其中A是软件包的某个版本,而A'是同一软件包的其他版本。因为B依赖于A的版本不同于树中已有的版本,所以它必须安装单独的副本。A'也必须安装B'。由于B'依赖于已被覆盖的A的原始版本,因此循环陷入无限回归。
为了避免这种情况,npm flat-out拒绝安装软件包文件夹祖先树中任何位置已经存在的任何name@version。一个更正确但更复杂的解决方案是将现有版本符号链接到新位置。如果这影响了实际用例,将对其进行调查。
原文:https://docs.npmjs.com/cli-commands/install.html