toolfree

套件管理器指令對照

四個套件管理器的常用指令並排對照,可以直接填入你自己的套件名稱。並標出 Yarn 1 與 Yarn 2 以上不同之處,以及根本沒有對應指令的地方。

在你的瀏覽器中執行

要做的事npmyarnpnpmbun
安裝 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 1Yarn 2+
CI 安裝yarn install --frozen-lockfileyarn install --immutable
升級yarn upgradeyarn up
看哪些落後yarn outdatedyarn upgrade-interactive
安全通報yarn audityarn npm audit
不安裝直接執行沒有對應yarn dlx

上面的表格顯示的是 Berry,因為 corepack enable 給你的就是它,package.json 裡的 packageManager 欄位鎖的也是它。Yarn 1 不同的地方會列在該格下面。

有些情況根本沒有對應指令

Yarn 2 以上沒有全域安裝yarn global add 被移除而且刻意不補回來,維護者的理由是:全域安裝 等於讓一個專案的相依跑出專案之外。yarn dlx 不是替代品——它是下載、執行一次、丟掉。

表格在這種情況直接寫「沒有對應指令」,而不是塞一個看起來最像的。會猜的對照表比會承認缺口的更糟。

行為真的不一樣的那幾條

大部分列只是同一件事的不同寫法。有三條不是:

Lockfile 不能互轉

換管理器不是把指令翻譯一下就好。每一個管理器都寫自己的 lockfile——package-lock.jsonyarn.lockpnpm-lock.yamlbun.lock——而且沒有一個讀得懂別人的。真正的遷移是刪掉舊的 lockfile、重新安裝,然後檢查解出來的版本是不是你要的那些。

只 commit 一個 lockfile。倉庫裡放兩個,就會變成誰跑哪個指令、誰就得到不同的相依樹。

相關

只需要其中一組的話,npm 轉 Yarnnpm 轉 pnpm 是同一張表的兩欄版本。

你輸入的東西不會送到任何地方。表格本來就在頁面裡,代入是在你的瀏覽器做的。