npm install 全方位解讀

本文參考了NPM中文文檔寫做而成的html

npm install 功能

安裝軟件包node

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 <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]

npm install 說明

此命令將安裝軟件包及其依賴的任何軟件包。若是程序包具備程序包鎖定或收縮包裝文件,則依賴項的安裝將由該程序驅動,npm-shrinkwrap.json 若是兩個文件都存在,則優先。請參閱 package-lock.json 和 npm- shrinkwrap。git

A package 是:github

  • a)包含文件描述的程序的 package.json 文件夾
  • b)包含(a)的壓縮 tarball
  • c)解析爲(b)的網址
  • d)<name>@<version>在 npm-registry(c)的註冊表中發佈的 a
  • e)指向(d)的 a <name>@<tag>(參見 npm-dist-tag)
  • f)<name>具備知足(e)的「最新」標籤的 a
  • g)<git remote url>解析爲(a)的 a

即便您從未發佈過軟件包,若是您只想編寫一個節點程序(a),或者若是您還但願可以在打包後將其輕鬆安裝到其餘地方,使用 npm 仍然能夠得到不少好處。放入壓縮檔(b)。算法

npm install

在軟件包目錄中,沒有參數:npm

將依賴項安裝在本地 node_modules 文件夾中。json

在全局模式下(即,帶有命令 -g 或 --global 附加到命令後),它將當前程序包上下文(即,當前工做目錄)安裝爲全局程序包。api

默認狀況下,npm install 將安裝列爲依賴項的全部模塊 package.json。ssh

使用該 --production 標誌(或將 NODE_ENV 環境變量設置爲 production)時,npm 將不會安裝中列出的模塊 devDependencies。ide

注意:將 --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 具備 name 和 version 屬性的文件。

例:

npm install ./package.tgz

npm install <tarball url>

提取 tarball 網址,而後安裝它。爲了區分此選項和其餘選項,參數必須以「 http://」或「 https://」開頭

例:

npm install https://github.com/indexzero/forever/tarball/v0.5.6

npm install [<@scope>/]<name>

進行<name>@<tag>安裝,<tag>「標籤」配置在哪裏。(請參閱 npm config
。配置的默認值爲 latest。)

在大多數狀況下,這將安裝 latest 在 npm 註冊表上標記爲的模塊的版本 。

例:

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 range 運算符。
  • -B, --save-bundle:保存的依賴項也將添加到您的 bundleDependencies 列表中。

此外,若是您具備 npm-shrinkwrap.json 或,package-lock.json 那麼它也會被更新。

<scope>是可選的。該包將從與指定範圍關聯的註冊表中下載。若是沒有註冊表與給定範圍相關聯,則採用默認註冊表。請參閱 npm-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 [<@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。

請注意,大多數版本範圍必須用引號引發來,以便您的外殼將其視爲單個參數。

例:

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,或 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 手冊頁。

例子:

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>]

https://github.com/githubname/githubrepo 經過嘗試使用克隆它來安裝軟件包 git。

若是#<commit-ish>提供,它將用於精確克隆該提交。若是 commit-ish 的格式爲#semver:<semver>,則<semver>能夠是任何有效的 semver 範圍或確切的版本,而且 npm 會在遠程存儲庫中查找與該範圍匹配的任何標記或引用,這與註冊表依賴性相似。若是未指定#<commit-ish>#semver:<semver>,則 master 使用。

與常規 git 的依賴,dependencies 而且 devDependencies 將安裝若是包有一個 prepare 腳本,作包,而後再安裝。

例子:

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 的依賴,dependencies 而且 devDependencies 將安裝若是包有一個 prepare 腳本,作包,而後再安裝。

例:

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 的依賴,dependencies 而且 devDependencies 將安裝若是包有一個 prepare 腳本,作包,而後再安裝。

例:

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 使用。

與常規 git 的依賴,dependencies 而且 devDependencies 將安裝若是包有一個 prepare 腳本,作包,而後再安裝。

例:

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 和下載依賴。

即便磁盤上存在本地副本,-for --force 參數也將強制 npm 獲取遠程資源。

npm install sax --force:

-g--global 參數會致使 NPM 在全球範圍內,而不是在本地安裝包。請參閱 npm-folders。

--global-style 參數將使 npm 以 node_modules 與全局 node_modules 文件夾相同的佈局將軟件包安裝到本地文件夾中。只有直接依賴項會顯示在其中 node_modules,它們所依賴的全部內容都將在其 node_modules 文件夾中展平 。顯然,這將消除一些重複數據刪除。

--ignore-scripts 參數將致使 npm 不執行 package.json 中定義的任何腳本。請參閱 npm-scripts。

--legacy-bundling 參數將致使 npm 安裝軟件包,以便 1.4 以前的 npm 版本(例如節點 0.8 附帶的版本)能夠安裝軟件包。這消除了全部自動重複數據刪除。

--link 在某些狀況下,該參數將致使 npm 將全局安裝連接到本地 ​​ 空間。

--no-bin-links 參數將阻止 npm 爲軟件包可能包含的任何二進制文件建立符號連接。

--no-optional 參數將防止安裝可選的依賴項。

--no-shrinkwrap 參數將忽略可用的程序包鎖定或收縮包裝文件,而改用 package.json。

--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 詳細信息,請參見。

請參閱 npm config
。許多配置參數都會對安裝產生影響,由於這是 npm 的大部分工做。

算法

要安裝軟件包,npm 使用如下算法:

load the existing node_modules tree from disk
clone the tree
fetch the package.json and assorted metadata and add it to the clone
walk the clone and add any missing dependencies
dependencies will be added as close to the top as is possible
without breaking any other modules
compare the original tree with the cloned tree and make a list of
actions to take to convert one to the other
execute all of the actions, deepest first
kinds of actions are install, update, remove and move:

對於如下 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-folders。

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 軟件包文件夾祖先樹中任何位置已經存在的任何內容。一個更正確但更復雜的解決方案是將現有版本符號連接到新位置。若是這影響了實際用例,將對其進行調查。

本文參考NPM中文文檔

相關文章
相關標籤/搜索