執行環境套件管理器打包器測試執行器程式碼檢查格式化指南參考部落格意見回饋

bun pm

套件管理器工具

bun pm 命令組是一組用於使用 Bun 套件管理器的實用工具。

pack

建立當前工作區的 tar 包:

terminal
bun pm pack

bun pm pack 會建立一個包含所有將釋出到 npm 的檔案的 .tgz 檔案,並遵循與 npm pack 相同的規則。

範例

基本用法:

terminal
bun pm pack
# 在當前目錄建立 my-package-1.0.0.tgz

指令碼靜默模式:

terminal
TARBALL=$(bun pm pack --quiet)
echo "Created: $TARBALL"
Text
Created: my-package-1.0.0.tgz

自定義目標目錄:

terminal
bun pm pack --destination ./dist
# 在 ./dist/ 目錄儲存 tar 包

選項

  • --dry-run:執行所有任務,但不將壓縮包寫入磁碟。顯示將包含的內容。
  • --destination <dir>:儲存壓縮包的目錄。
  • --filename <name>:壓縮包的確切檔名。
  • --ignore-scripts:跳過執行 pre/postpack 和 prepare 指令碼。
  • --gzip-level <0-9>:設定 gzip 壓縮級別,範圍為 0 到 9(預設為 9)。
  • --quiet:僅輸出壓縮包檔名,抑制其餘輸出。在指令碼中很有用。

注意: --filename 和 --destination 不能同時使用。

輸出模式

預設輸出:

terminal
bun pm pack
Text
bun pack v1.2.19

packed 131B package.json
packed 40B index.js

my-package-1.0.0.tgz

Total files: 2
Shasum: f2451d6eb1e818f500a791d9aace80b394258a90
Unpacked size: 171B
Packed size: 249B

靜默輸出:

terminal
bun pm pack --quiet
Text
my-package-1.0.0.tgz

bin

列印當前專案的 bin 目錄路徑:

terminal
bun pm bin
Text
/path/to/current/project/node_modules/.bin

列印全域性 bin 目錄路徑:

terminal
bun pm bin -g
Text
<$HOME>/.bun/bin

ls

要列印當前專案中已安裝相依及其解析後的版本,不包括它們的相依:

terminal
bun pm ls
# 或者
bun list
Text
/path/to/project node_modules (135 installed)
├── eslint@8.38.0
├── react@18.2.0
├── react-dom@18.2.0
├── typescript@5.0.4
└── zod@3.21.4

要列印所有已安裝的相依,包括第 n 階相依:

terminal
bun pm ls --all
# 或者
bun list --all
Text
/path/to/project node_modules (135 installed)
├── @eslint-community/eslint-utils@4.4.0
├── @eslint-community/regexpp@4.5.0
├── @eslint/eslintrc@2.0.2
├── @eslint/js@8.38.0
├── @nodelib/fs.scandir@2.1.5
├── @nodelib/fs.stat@2.0.5
├── @nodelib/fs.walk@1.2.8
├── acorn@8.8.2
├── acorn-jsx@5.3.2
├── ajv@6.12.6
├── ansi-regex@5.0.1
├── ...

僅列印受信任的相依(允許執行生命週期指令碼的相依)。當在 package.json 中設定了 trustedDependencies 時,Bun 會顯示該列表中的軟體包;否則會顯示其預設受信任相依列表中的軟體包。

terminal
bun pm ls --trusted
# 或者
bun list --trusted
Text
/path/to/project node_modules (135 installed)
└── esbuild@0.21.5

licenses

列出所有已安裝的軟體包,並按許可證分組;許可證資訊取自 node_modules 中每個軟體包的 package.json。對於沒有 license 欄位的軟體包,Bun 會將其列在 Unknown 下。Bun 會為僅通過 devDependencies 可訪問的軟體包標記 (dev)。

terminal
bun pm licenses
# or
bun pm licenses ls
Text
bun pm licenses v1.3.0 (a4b2f86f)

MIT (2)
├── path-parse@1.0.6
└── resolve@1.9.0

Unknown (4)
├── a-dep@1.0.1 (dev)
├── no-deps@1.0.0
├── no-deps@1.0.1
└── one-dep@1.0.0

6 packages across 2 licenses (checked 6 packages in bun.lock) [4.00ms]
FlagDescription
--json將 JSON 物件按許可證作為鍵輸出
--long同時列印每個軟體包的 author、description 和 homepage
--prod、-p跳過 devDependencies(等同於 --omit=dev)
--dev、-D僅列出由 devDependencies 引入的內容
--omit=<dev|optional|peer>跳過一種相依型別,與 bun install 中的行為相同
--filter <pattern>、-F僅列出匹配工作區的相依(篩選語法)
terminal
bun pm licenses --json --prod
JSON
{
  "MIT": [
    {
      "name": "path-parse",
      "versions": ["1.0.6"],
      "paths": ["/home/me/app/node_modules/path-parse"],
      "license": "MIT",
      "homepage": "https://github.com/jbgutierrez/path-parse#readme",
      "author": "Javier Blanco <http://jbgutierrez.info>",
      "description": "Node.js path.parse() ponyfill"
    }
  ]
}

在工作區根目錄中,Bun 會列出每個工作區的相依。在工作區軟體包內部,Bun 只會列出該軟體包的相依。使用 bun why 查明是什麼引入了意料之外的軟體包。

需要同時存在 bun.lock 和 node_modules。對於存在於鎖檔案中、但在 node_modules 中缺失的軟體包(例如執行 bun install --production 後),Bun 會跳過並列印警告。

diff

顯示軟體包兩個版本之間的變化:已修改檔案和行的摘要、值得再次檢查的 package.json 變更(新的安裝指令碼、相依、入口點、二進位制檔案),然後顯示每個檔案的統一差異。每一側都可以是登錄檔規格、本地資料夾或 .tgz。

terminal
bun pm diff react                     # the version in bun.lock → latest
bun pm diff react@18.2.0 19.0.0       # two published versions
bun pm diff react@18.2.0..19.0.0      # same thing
bun pm diff ./vendored-pkg pkg@2.1.0  # a folder against a published version
bun pm diff                           # in a package folder: what is published → this folder
Text
is-number@6.0.0 → is-number@7.0.0
4 files changed, 0 added, 0 removed  (+73 -44 lines)

  ! engines changed: { "node": ">=0.10.0" } → { "node": ">=0.12.0" }

diff --bun a/index.js b/index.js
--- a/index.js
+++ b/index.js
@@ -9,10 +9,10 @@
 module.exports = function(num) {
   if (typeof num === 'number') {
-    return num - num === 0;
+    return num - num === 0;
   }
...

在終端中,程式碼會按含義進行比較,並按原樣顯示。每個 .js/.mjs/.cjs/.jsx/.ts/.tsx 檔案的兩側都會被解析並以統一的規範形式重新列印(等價語法會摺疊,不可達程式碼會丟棄);該規範形式決定_發生了什麼變化_,而差異塊顯示_原始_行——註釋、型別、JSX 和名稱均保持原樣:

  • 1 + 1 與 2、'a' 與 "a"、!0 與 true、重新換行的呼叫、整個檔案的重新格式化,或在各處保持一致的區域性重新命名(打包器將 utils 改為 utils$1)都不算變化——兩側的區域性變數會根據用法進行匹配,而非根據名稱。以這種方式摺疊的行會計入檔案標頭(3 folded),沒有剩餘內容的檔案會顯示為 formatting only。
  • 註釋編輯、型別標註變更或任何控制流變化都算作變化,並以作者原本的措辭顯示。
  • 含義發生變化的未更改文本——變得不可達的程式碼,或因其他位置的條件翻轉而重新啟用的死程式碼——會標記為 ~。
  • 壓縮後的包沒有可讀的原始內容,因此會用未壓縮的重新列印結果代替(每行一個宣告、呼叫和屬性,並按原始檔案中的 line:col 標註);相同的摺疊比較方式會決定發生了什麼變化,同時兩個建置版本的壓縮器以不同方式分配的短名稱會被同步重新命名;dist/*.min.js 的差異會精確縮小到實際變化的行,而不是顯示成一對巨大的 -/+。.json 和 .css 檔案會按規範列印形式(normalized)進行比較和顯示,因此圍繞一處編輯的重新格式化只算一處編輯;列印結果完全相同則顯示為 formatting only。
  • 末尾的摘要會列出審查者首先關注的內容:新的 install/postinstall 指令碼、相依和入口點變更、新匯入 child_process/fs/net/http/vm/… 的檔案、新的軟體包匯入、eval()/new Function()/process.env/fetch() 用法增加、新增的執行檔,以及釋出內容中出現的終端轉義序列或雙向文本控制字元。*.map 檔案會摘要為已重新生成,而不顯示具體內容。超過 64 MB 的檔案會按文本進行差異比較(too large to normalize)。
  • 行顏色會遵循終端設定:亮色或暗色模式取自 COLORFGBG,或通過查詢終端背景顏色(OSC 11)確定;當 COLORTERM=truecolor 時會使用精確顏色。
  • 軟體包中的任何內容都不能控制你的終端:檔案內容中的控制字元、轉義序列和雙向文本覆蓋字元會顯示為 ␛、^M、‹U+202E›。許可權變更會顯示為 mode 644 → 755 / new file mode 100755。

若要檢視軟體包的部分內容,可指定檔案:將其作為規格的 :path 字尾、單獨的 :path 引數,或在兩側引數之後新增額外引數。路徑可以精確匹配檔案、目錄、軟體包中任意位置的檔名,或 glob:

bash
$ bun pm diff axios@1.6.0:lib/adapters 1.6.1          # one directory
$ bun pm diff axios@1.6.0 axios@1.6.1 dist/node/axios.cjs README.md
$ bun pm diff lodash :trimEnd.js                       # installed → latest, one file
$ bun pm diff react-dom@18.2.0 18.3.1 '*.min.js'
$ bun pm diff react-dom@18.2.0 18.3.1 'cjs/**/*.production.min.js'

對於包含 package.json 的本地資料夾,Bun 會按照 bun pm pack 釋出資料夾的方式讀取它——包括 files 欄位、.npmignore / .gitignore 和 bin——因此將檢出目錄與登錄檔版本進行差異比較時,對比的是實際將釋出的內容,而不是 node_modules/、vendor/ 或建置輸出。

通過管道傳輸或設定 NO_COLOR 時,輸出會是實際檔案內容的純文本統一補丁(因此 bun pm diff a b > changes.patch 可應用該補丁);--raw 也會在終端中關閉重新列印。

FlagDescription
--raw、--unformatted按原始位元組進行比較;跳過 JS/CSS/JSON 的重新列印
--minify同時摺疊等價語法(!0/true、引號風格、多餘括號),僅比較含義
--unminify在每個 JS 檔案中同步重新命名短區域性變數,而不只是看起來經過壓縮的檔案
-w、--ignore-space在終端中,對於僅空白字元不同的檔案,顯示為 whitespace only,而不是差異塊
--stat每個檔案用一行顯示變更數量和條形圖,而不是差異塊
--name-only僅列出存在差異的檔案,並標記為新增(A)、修改(M)或刪除(D)
-U <n>、--unified每處變更周圍的上下文行數(預設為 3)
--diff <spec>以相容 npm 的方式指定一側;可指定兩次
--json輸出一個 JSON 文件:包含 from/to、每個檔案的 status/計數/patch、純文本 notes 和 totals

只提供一個名稱且不指定版本時,左側為此專案的 bun.lock 解析到的版本,右側為 latest,因此 bun pm diff <pkg> 可以回答“更新此軟體包會引入什麼?”。登錄檔、作用域和身份驗證設定與 bun install 一樣,來自 bunfig.toml / .npmrc;在專案外部,只接受登錄檔規格以及絕對路徑或 ./ 路徑。

whoami

列印你的 npm 使用者名稱。需要已登入(bunx npm login)並在 bunfig.toml 或 .npmrc 中儲存憑據:

terminal
bun pm whoami

雜湊

生成並列印當前鎖檔案的雜湊:

terminal
bun pm hash

列印用於雜湊鎖檔案的字串:

terminal
bun pm hash-string

列印當前鎖檔案中儲存的雜湊:

terminal
bun pm hash-print

快取

列印 Bun 的全域性模組快取路徑:

terminal
bun pm cache

清除 Bun 的全域性模組快取:

terminal
bun pm cache rm

遷移

遷移其他套件管理器的鎖檔案,不安裝任何東西:

terminal
bun pm migrate

未受信任

列印當前帶有指令碼的未受信任相依:

terminal
bun pm untrusted
Text
./node_modules/@biomejs/biome @1.8.3
 » [postinstall]: node scripts/postinstall.js

這些相依在安裝時其生命週期指令碼被阻止執行。

trust

執行未受信任相依的指令碼並新增到 trustedDependencies:

terminal
bun pm trust <names>

trust 命令選項:

  • --all:信任所有未受信任的相依。

default-trusted

列印預設可信賴相依列表:

terminal
bun pm default-trusted

檢視 GitHub 上的當前列表。

version

顯示當前包版本及幫助資訊:

terminal
bun pm version
Text
bun pm version v1.3.3 (ca7428e9)
當前包版本:v1.0.0

版本增量:
  patch      1.0.0 → 1.0.1
  minor      1.0.0 → 1.1.0
  major      1.0.0 → 2.0.0
  prerelease 1.0.0 → 1.0.1-0
  prepatch   1.0.0 → 1.0.1-0
  preminor   1.0.0 → 1.1.0-0
  premajor   1.0.0 → 2.0.0-0
  from-git   使用最新 git 標籤的版本
  1.2.3      設定指定版本

選項:
  --no-git-tag-version 跳過 git 操作
  --allow-same-version 避免版本相同時報錯
  --message=<val>、-m  自定義提交資訊,使用 %s 代替版本號
  --preid=<val>        預發行標識(例如 beta → 1.0.1-beta.0)
  --force、-f          跳過檢查 git 是否髒狀態

範例:
  bun pm version patch
  bun pm version 1.2.3 --no-git-tag-version
  bun pm version prerelease --preid beta --message "Release beta: %s"

在 package.json 中升級版本:

terminal
bun pm version patch
Text
v1.0.1

支援 patch、minor、major、premajor、preminor、prepatch、prerelease、from-git,或類似 1.2.3 的指定版本。預設情況下會建立 git 提交和標籤;傳入 --no-git-tag-version 可跳過這些操作。

pkg

管理 package.json 資料,可進行獲取、設定、刪除及修復操作。

所有命令支援點號和中括號路徑表示法:

terminal
scripts.build              # 點號表示法
contributors[0]            # 訪問陣列項
workspaces.0               # 數字索引的點號表示法
scripts[test:watch]        # 中括號表示特殊字元

範例:

terminal
# 獲取
bun pm pkg get name                               # 單個屬性
bun pm pkg get name version                       # 多個屬性
bun pm pkg get                                    # 整個 package.json
bun pm pkg get scripts.build                      # 巢狀屬性

# 設定
bun pm pkg set name="my-package"                  # 簡單屬性
bun pm pkg set scripts.test="jest" version=2.0.0  # 多個屬性
bun pm pkg set private=true --json                # 使用 --json 標誌的 JSON 值

# 刪除
bun pm pkg delete description                     # 單個屬性
bun pm pkg delete scripts.test contributors[0]    # 多個或巢狀屬性

# 修復
bun pm pkg fix                                    # 自動修復常見問題