npminstall命令(翻译)
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为准。请参阅和npm收缩包装。
⼀个包是:
a) 包含package.json⽂件描述的程序的⽂件夹
b) 包含package.json⽂件描述的压缩包
c) 解析为(b)的⽹址
d) 在(c)的注册表中发布的<name> @ <version>(see )
e) 指向(d)的 <name>@<tag>(see )
f) 具有满⾜(e)以下条件的“latest”标签的<name>
g) 解析为(a)的<git remote url>
即使您从未发布过软件包,如果您只想编写⼀个节点程序(a),或者如果您还希望能够在打包后将其轻松安装到其他地⽅,使⽤npm仍然可以获得很多好处。放⼊压缩档(b)。
* npm install
在软件包⽬录中,⽆参数
将依赖项安装在本地node_modules⽂件夹中。
在全局模式下(即,在命令后附加-g或--global),它将当前程序包上下⽂(即当前⼯作⽬录)安装为全局程序包。
默认情况下,npm install将安装所有列为中的依赖项的模块。
使⽤--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,.或.tgz作为扩展名。
软件包内容应驻留在tarball的⼦⽂件夹中(通常称为package/)。 npm在安装软件包时会剥离⼀个⽬录层(运⾏tar x --strip-
components = 1等效)。
该软件包必须包含具有名称和版本属性的package.json⽂件。
Example:
npm install ./
* npm install <tarall url>:
Example:
npm install github/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:npm/cli.git#v1.0.27
npm install git+ssh://git@github:npm/cli#semver:^5.0
npm install git+isaacs@github/npm/cli.git
npm install git://github/npm/cli.git#v1.0.27
GIT_SSH_COMMAND='ssh -i ~/.ssh/custom_ident' npm install git+ssh://git@github:npm/cli.git
* npm install <githubname>/<githubrepo>[#<commit-ish>]
* npm install github:<githubname>/<githubrepo>[#<commit-ish>]
如果提供了#<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依赖项⼀样,如果软件包具有prepare脚本,则将在软件包完成安装之前安装dependencies和devDependencies。
Example:
npm install gist:101a11beef
* npm install bitbucket:<bitbucketname>/<bitbucketrepo>[#<commit-ish>]
如果提供了#<commit-ish>,它将⽤于精确克隆该提交。如果commit-ish的格式为#semver:<semver>,则<semver>可以是任何有效的semver范围或确切版本,并且npm会在远程存储库中查与该范围匹配的任何标记或引⽤。注册表依赖项。如果未指定#<commit-ish>或#semver:<semver>,则使⽤master。
与常规git依赖项⼀样,如果软件包具有prepare脚本,则将在软件包完成安装之前安装dependencies和devDependencies。
Example:
npm install bitbucket:mybitbucketuser/myprojectinput命令
* npm install gitlab:<gitlabname>/<gitlabrepo>[#<commit-ish>]
如果提供了#<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参数将隐藏每次安装结束时显⽰的消息,该消息确认正在寻资⾦的依赖项的数量。见
-g或--global参数将使npm在全局⽽⾮本地安装软件包。See .
--global-style参数将使npm以与全局node_modules⽂件夹相同的布局将软件包安装到本地node_modules⽂件夹中。只有直接依赖项将显⽰在node_modules中,⽽它们依赖的所有内容都将在其node_modules⽂件夹中展平。显然,这将消除⼀些重复数据删除。
--ignore-scripts参数将导致npm不执⾏package.json中定义的任何脚本。See 。
--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参数可⽤于禁⽤将审核报告发送到已配置的注册表。有关发送内容的详细信息,请参见。
See . 许多配置参数都会对安装产⽣影响,因为这是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。⼀个更正确但更复杂的解决⽅案是将现有版本符号链接到新位置。如果这影响了实际⽤例,将对其进⾏调查。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论