npm install命令(翻译)


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-lockshrinkwrap(收缩包装) 文件,则依赖项的安装将由该程序驱动,如果两个文件都存在,则以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时安装dependenciesdevDependencies中列出的所有模块,可以使用--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.jsonpackage-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脚本,则在打包和安装软件包之前,将安装其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手册页。

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脚本,则将在软件包完成安装之前安装dependenciesdevDependencies

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脚本,则将在软件包完成安装之前安装dependenciesdevDependencies

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脚本,则将在软件包完成安装之前安装dependenciesdevDependencies

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脚本,则将在软件包完成安装之前安装dependenciesdevDependencies

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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM