Wednesday, February 13, 2019

NPM 基本操作

使用 Node.js 為基礎的工具時,基本上都會碰上 npm 這個工具。

安裝套件使用的是 npm install [套件] 子指令,參照套件的描述方法有:

  • (沒參數,工作目錄需在套件資料夾中)
  • [<@scope>/]<name>
  • [<@scope>/]<name>@<tag>
  • [<@scope>/]<name>@<version>
  • [<@scope>/]<name>@<version range>
  • <git-host>:<git-user>/<repo-name>
  • <git repo url>
  • <tarball file>
  • <tarball url>
  • <folder>

在 npm 中,「套件」可以是資料夾、壓縮檔或 Git 檔案庫,只要要作為套件的基礎資料夾中有 package.json 檔案即可。

相依套件的版本管理則是透過 npm-shrinkwrap.jsonpackage-lock.json 檔案,基本上如果套件要發佈的話,只有 npm-shrinkwrap.json 會有意義,後面的 package-lock.json 只會在 top-level 套件有作用,比較只是開發時期團隊可以共用來鎖定目前的相依版本。

依照 npm 的規劃,一般函式庫套件應該只有 package-lock.json 以作為其他開發者的參考,在安裝時期不會有任何作用,版本的解析會依照 package.json 中的描述進行。如果是作為 CLI 工具等「全域」的套件,則可以加上 npm-shrinkwrap.json 來鎖定確定可以正常運作的版本。

參考套件時,使用 <name> 系列的方法所參考的名稱或是版本是指 npm registry 中的名稱與版本。

套件發佈時可以選擇發佈在使用者或組織專屬的 scope 下,參考時的語法是 @scope/name。利用 scope 可以把關聯的套件放在一起,也比較不用擔心名稱空間衝突的問題。

套件檔案的安排可以在 npm-folders 看到:

使用 Global 模式安裝 (加上 -g | --global 參數) 時:

套件檔案會裝到 Node.js 安裝路徑上的 lib/node_modules/{套件識別路徑} 資料夾中,如果有可執行的指令稿,會連結到安裝路徑的 bin/ 中。

使用 Local 模式安裝 (預設) 時:

套件檔案會安裝到目前工作專案資料夾下的 node_modules/{套件識別路徑} 資料夾中,如果有可執行的指令稿,會連結到目前工作資料夾下的 node_modules/.bin/ 中。

npm 在找尋工作專案資料夾的方法是一層一層往上找尋含有 package.json 檔或 node_modules/ 資料夾的資料夾,作為工作專案資料夾。

從測試來看,如果是 Global 模式時,相依的套件會安裝到套件識別路徑下的 node_modules/ 中,而 Local 模式的話則不會。

舉例來說,在分別使用 Global 與 Local 模式安裝 @angular/cli 的話,相依的 typescript 套件被放置的路徑會分別是:

  • Global: ${NODE-PREFIX}/lib/node_modules/@angular/cli/node_modules/typescript/
  • Local: ${PROJECT}/node_modules/typescript/

No comments: