2023/03/20 # 紀錄從 Yarn 改為 pnpm Node Package Manager ## 前言 本篇文章簡單紀錄既有開發中的專案原先使用`yarn`套件管理器,改為使用`pnpm`做為套件管理器的設定過程。 # Migration ## 一、用`npm`安裝`pnpm` 安裝指令 ``` npm install -g pnpm ``` 確認安裝版本 ``` pnpm --version ``` ![](https://i.imgur.com/MOjnMzW.png) **(也可以為pnpm加入簡短別名pn,設定方式請往下看)** ## 二、刪除`node_modules` ``` npx npkill ``` ## 三、編輯`package.json` 新增一個腳本 ``` "scripts": { "preinstall": "npx only-allow pnpm", ... } ``` 這可以防止其他開發人員或是自己以後意外安裝帶有`pnpm`以外的任何依賴項。 ### 建立`pnpm-workspace.yaml` (非必要,適合monorepo) *for monorepo ``` packages: # include packages in subfolders (e.g. apps/ and packages/) - "apps/**" - 'packages/**' # if required, exclude some directories - '!**/test/**' ``` ## 四、執行`pnpm import` 在專案執行 `pnpm import` 這個指令會產生`pnpm-lock.yaml`檔案(基於我們專案內的`yarn.lock`檔案或是`packages-lock.json`) 安裝之後可能會出現如下錯誤: ```  WARN  Issues with peer dependencies found . └─┬ eslint-config-next 13.2.4 ├── ✕ missing peer typescript@>=3.3.1 └─┬ @typescript-eslint/parser 5.55.0 ├── ✕ missing peer typescript@"*" └─┬ @typescript-eslint/typescript-estree 5.55.0 ├── ✕ missing peer typescript@"*" └─┬ tsutils 3.21.0 └── ✕ missing peer typescript@">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" Peer dependencies that should be installed: typescript@>=3.3.1 pericode@MSI:~/dev-projects/react-portfolio$ ``` 這告訴我專案缺少一些peer dependencies,當然我可以手動安裝缺少的peer dependencies,例如安裝typescript@>=3.3.11。 我選擇設定pnpm的auto-install-peers選項為true,這樣pnpm會自動安裝peer dependencies。 **Fix** 在專案根目錄新增`.npmrc`檔案,新增內容: ``` auto-install-peers=true ``` ## 五、刪除 yarn.lock 檔案 (or packages-lock.json) 刪除專案根目錄裡的`yarn.lock` 或是 `packages-lock.json` ## 六、安裝依賴項 執行安裝指令: ``` pnpm i ``` ## 七、以 `pnpm` (`pn`) 指令取代 `npm run` (or `yarn`) 修改`package.json`或其他有關檔案的Script,確保專案以pnpm指令管理。 例如執行`pnpm dev` 命令部署開發專案,確定正常執行。 ### 使用較短的別名: `pn` 覺得字數太多的話,我們可以設定改用比較短的別名`pn`來取代`pnpm`。 例如在 POSIX系統中(ex: Linux)加入永久別名,以記事本開啟`.bashrc`文件, 將下面這行命令貼上儲存。 ``` # pnpm shorthand alias pn=pnpm ``` 之後可以用較簡短的`pn dev`指令來執行本地部署開發。 ## 參考 - https://dev.to/andreychernykh/yarn-npm-to-pnpm-migration-guide-2n04 - https://stackoverflow.com/questions/72468635/pnpm-peer-dependencies-auto-install - https://pnpm.io/installation