使用 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.json
與 package-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:
Post a Comment