套件管理器指令對照
四個套件管理器的常用指令並排對照,可以直接填入你自己的套件名稱。並標出 Yarn 1 與 Yarn 2 以上不同之處,以及根本沒有對應指令的地方。
在你的瀏覽器中執行
| 要做的事 | npm | yarn | pnpm | bun |
|---|---|---|---|---|
| 安裝 lockfile 裡的全部相依 | ||||
| CI 安裝,lockfile 若會改動就失敗 | Yarn 1(Classic): | |||
| 新增相依套件 | ||||
| 新增開發相依 | ||||
| 鎖定版本,不用範圍 | ||||
| 全域安裝 | 沒有對應指令 Yarn 1(Classic): | |||
| 移除相依套件 | ||||
| 在既有版本範圍內更新 | Yarn 1(Classic): | |||
| 列出落後最新版的套件 | Yarn 1(Classic): | |||
| 執行 package.json 裡的 script | ||||
| 不安裝就執行套件的執行檔 | ||||
| 建立新套件 | ||||
| 查出某個套件為什麼被裝進來 | ||||
| 檢查相依套件的安全通報 | Yarn 1(Classic): | |||
| 把相依裝到某一個 workspace |
Yarn 欄位是 Yarn 2 以上(Berry)。Yarn 1 不同的地方會列在下面。
四個管理器,同一件事,四種寫法
這些指令沒有一個難記,難的是要記四遍——公司的專案用 pnpm、要發 PR 的開源專案用 Yarn、 而 README 是照 npm 寫的。
在上面輸入套件名稱,表格裡的指令會全部填好。點任何一格就複製。
一般對照表錯的兩個地方
yarn 指的是兩個不同的程式
Yarn 1(Classic)與 Yarn 2 以上(Berry)不是同一個程式,而且差別剛好落在大家會去查的那幾條:
| 要做的事 | Yarn 1 | Yarn 2+ |
|---|---|---|
| CI 安裝 | yarn install --frozen-lockfile | yarn install --immutable |
| 升級 | yarn upgrade | yarn up |
| 看哪些落後 | yarn outdated | yarn upgrade-interactive |
| 安全通報 | yarn audit | yarn npm audit |
| 不安裝直接執行 | 沒有對應 | yarn dlx |
上面的表格顯示的是 Berry,因為 corepack enable 給你的就是它,package.json 裡的
packageManager 欄位鎖的也是它。Yarn 1 不同的地方會列在該格下面。
有些情況根本沒有對應指令
Yarn 2 以上沒有全域安裝。yarn global add 被移除而且刻意不補回來,維護者的理由是:全域安裝
等於讓一個專案的相依跑出專案之外。yarn dlx 不是替代品——它是下載、執行一次、丟掉。
表格在這種情況直接寫「沒有對應指令」,而不是塞一個看起來最像的。會猜的對照表比會承認缺口的更糟。
行為真的不一樣的那幾條
大部分列只是同一件事的不同寫法。有三條不是:
npm ci會先刪掉node_modules,其他三個不會。pnpm install --frozen-lockfile和yarn install --immutable會在 lockfile 將被改動時失敗,這正是 CI 要的性質,但它們會沿用已經 存在的東西。npm run <script>的run不能省。yarn build、pnpm build可以直接寫;npm build也能執行,但那是另一個已被廢棄的指令,不是你的 script。bun run <script>同樣要寫run, 因為bun <檔案>是拿來執行檔案的。npx在本機沒有時會去 registry 抓。pnpm dlx和bunx也是。但 Yarn 1 的yarn <bin>只找得到已經在node_modules裡的執行檔,所以那一列沒有 Classic 的寫法。
Lockfile 不能互轉
換管理器不是把指令翻譯一下就好。每一個管理器都寫自己的 lockfile——package-lock.json、
yarn.lock、pnpm-lock.yaml、bun.lock——而且沒有一個讀得懂別人的。真正的遷移是刪掉舊的
lockfile、重新安裝,然後檢查解出來的版本是不是你要的那些。
只 commit 一個 lockfile。倉庫裡放兩個,就會變成誰跑哪個指令、誰就得到不同的相依樹。
相關
只需要其中一組的話,npm 轉 Yarn 與 npm 轉 pnpm 是同一張表的兩欄版本。
你輸入的東西不會送到任何地方。表格本來就在頁面裡,代入是在你的瀏覽器做的。