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

環境變數

在 Bun 中讀取和設定環境變數,包括自動支援 .env 檔案

Bun 會自動讀取你的 .env 檔案,並提供符合慣用方式的 API,以便以程式設計方式讀取和寫入環境變數。你還可以使用 Bun 特有的環境變數來設定 Bun 執行環境行為的部分內容。

設定環境變數

Bun 會自動讀取以下檔案(按優先順序升序排列)。

  • .env
  • .env.production, .env.development, .env.test(取決於 NODE_ENV 的值)
  • .env.local(當 NODE_ENV=test 時不會載入)
  • .env.production.local, .env.development.local, .env.test.local(取決於 NODE_ENV 的值)
.env
FOO=hello
BAR=world

你也可以在命令列中設定變數。

Linux/macOS
FOO=helloworld bun run dev
Windows
# 使用 CMD
set FOO=helloworld && bun run dev

# 使用 PowerShell
$env:FOO="helloworld"; bun run dev
跨平臺的 Windows 解決方案

如需跨平臺解決方案,請使用 Bun Shell,例如通過 bun exec 使用。

shell
bun exec 'FOO=helloworld bun run dev'

在 Windows 上,通過 bun run 呼叫的 package.json 指令碼會自動使用 Bun Shell,因此以下方式同樣支援跨平臺。

package.json
"scripts": {
  "dev": "NODE_ENV=development bun --watch app.ts",
},

或者,通過為 process.env 設定屬性,以程式設計方式設定變數。

TypeScript
process.env.FOO = "hello";

手動指定 .env 檔案

--env-file 標誌會覆蓋 Bun 載入的 .env 檔案。無論是使用 bun 執行檔案,還是執行 package.json 指令碼,都可以使用該標誌。

shell
bun --env-file=.env.1 src/index.ts

bun --env-file=.env.abc --env-file=.env.def run build

路徑不必是常規檔案。Bun 會讀取管道、FIFO 或裝置,直到輸入結束,因此無需將金鑰儲存在磁碟檔案中,也能將其傳遞給行程:

shell
bun --env-file=<(./fetch-secrets.sh) src/index.ts

echo "API_KEY=..." | bun --env-file=/dev/stdin src/index.ts

管道只能讀取一次。Bun 會在行程啟動時讀取管道,Worker 執行緒和 bun test --parallel 工作行程會複用這些值。使用相同引數再次啟動的行程會再次讀取該路徑:例如 --watch 重新載入,以及繼承 execArgv 的 child_process.fork() 或 cluster.fork() 子行程。此時管道已為空,而 FIFO 會等待新的寫入方,這與 Node.js 的情況相同。

停用自動載入 .env

使用 --no-env-file 可停用 Bun 自動載入 .env 檔案,例如在生產環境或 CI/CD 流程中,如果你希望完全相依系統環境變數。

shell
bun run --no-env-file index.ts

你也可以在 bunfig.toml 中停用此功能:

bunfig.toml
# 停用載入 .env 檔案
env = false

即使停用了預設載入,通過 --env-file 傳入的檔案仍會被載入。

當以 node 的身份呼叫時(例如通過 bun --bun、bunx --bun,或指向 Bun 的 node 符號連結呼叫),Bun 會停用自動載入 .env,以匹配 Node.js 的行為。這樣一來,Vite 的 loadEnv 等具有自身模式感知 .env 解析邏輯的工具,就可以選擇正確的 .env.{mode} 檔案,而不會將 Bun 預先填充的值視為由 shell 設定的覆蓋值。Bun 仍會遵循顯式指定的 --env-file 引數。


引號

Bun 支援雙引號、單引號和模板字串反引號:

.env
FOO='hello'
FOO="hello"
FOO=`hello`

擴充套件

Bun 會自動_擴充套件_環境變數,因此你可以引用之前定義的變數。

.env
FOO=world
BAR=hello$FOO
TypeScript
process.env.BAR; // => "helloworld"

擴充套件功能可用於構造連線字串或其他複合值。

.env
DB_USER=postgres
DB_PASSWORD=secret
DB_HOST=localhost
DB_PORT=5432
DB_URL=postgres://$DB_USER:$DB_PASSWORD@$DB_HOST:$DB_PORT/$DB_NAME

要停用擴充套件,請使用反斜槓轉義 $。

.env
FOO=world
BAR=hello\$FOO
TypeScript
process.env.BAR; // => "hello$FOO"

dotenv

Bun 會自動讀取 .env 檔案,因此無需使用 dotenv 和 dotenv-expand。

讀取環境變數

從 process.env 讀取當前環境變數。

TypeScript
process.env.API_TOKEN; // => "secret"

Bun 也通過 Bun.env 和 import.meta.env 暴露這些變數,它們都是 process.env 的別名。

TypeScript
Bun.env.API_TOKEN; // => "secret"
import.meta.env.API_TOKEN; // => "secret"

要列印當前設定的所有環境變數,請執行 bun --print process.env。

shell
bun --print process.env
BAZ=stuff
FOOBAR=aaaaaa
<更多行>

TypeScript

在 TypeScript 中,process.env 的所有屬性都被型別定義為 string | undefined。

TypeScript
Bun.env.whatever;
// string | undefined

要獲得自動補全,並告訴 TypeScript 將變數視為非可選字串,請使用介面合併。

TypeScript
declare module "bun" {
  interface Env {
    AWESOME: string;
  }
}

將此宣告新增到專案中的任意檔案中。它會全域性為 process.env 和 Bun.env 新增 AWESOME 屬性。

TypeScript
process.env.AWESOME; // => 字串

設定 Bun

Bun 讀取以下環境變數來設定其行為的各個方面。

名稱描述
NODE_TLS_REJECT_UNAUTHORIZEDNODE_TLS_REJECT_UNAUTHORIZED=0 會停用 SSL 證書驗證。適用於測試和除錯,但在生產環境中使用時務必謹慎。Node.js 引入了此變數;Bun 為了相容性保留了該名稱。
BUN_CONFIG_VERBOSE_FETCH如果 BUN_CONFIG_VERBOSE_FETCH=curl,那麼 fetch 請求會將 URL、方法、請求標頭和響應標頭記錄到控制台。此設定也適用於 node:http。BUN_CONFIG_VERBOSE_FETCH=1 與 BUN_CONFIG_VERBOSE_FETCH=curl 等效,但不會輸出 curl 格式的內容。
BUN_RUNTIME_TRANSPILER_CACHE_PATH執行環境轉譯器會快取大於 4 KB 的原始檔轉譯輸出,從而加快使用 Bun 的 CLI 的載入速度。如果設定了 BUN_RUNTIME_TRANSPILER_CACHE_PATH,Bun 會將快取寫入該目錄。如果將其設定為空字串或字串 "0",則會停用快取。如果未設定,Bun 會將快取寫入平臺特定的快取目錄。
TMPDIR在打包或執行其他操作期間,Bun 偶爾需要一個目錄來儲存中間資源。如果未設定,則預設為平臺特定的臨時目錄:Linux 上為 /tmp,macOS 上為 /private/tmp。
NO_COLOR如果 NO_COLOR=1,則會停用 ANSI 顏色輸出。
FORCE_COLOR如果 FORCE_COLOR=1,則會強制啟用 ANSI 顏色輸出,即使設定了 NO_COLOR 也是如此。
BUN_CONFIG_MAX_HTTP_REQUESTS設定 fetch 和 bun install 傳送的最大並行 HTTP 請求數。預設為 256。如果遇到速率限制或連線問題,請調低此值。
BUN_CONFIG_NO_CLEAR_TERMINAL_ON_RELOAD如果 BUN_CONFIG_NO_CLEAR_TERMINAL_ON_RELOAD=true,則 bun --watch 重新載入時不會清空控制台
DO_NOT_TRACK在崩潰時停用向 bun.report 上傳崩潰報告。在 macOS 和 Windows 上,預設啟用崩潰報告上傳。Bun 不會發送其他遙測資料,不過我們計劃新增一些遙測資料。如果 DO_NOT_TRACK=1,則會停用自動上傳崩潰報告和遙測資料。
BUN_OPTIONS將命令列引數新增到每次 Bun 執行的引數前面。例如,BUN_OPTIONS="--hot" 會使 bun run dev 的行為等同於 bun --hot run dev。

執行環境轉譯器快取

對於大於 4 KB 的檔案,Bun 會將轉譯後的輸出快取到 $BUN_RUNTIME_TRANSPILER_CACHE_PATH 或平臺特定的快取目錄中。這可以讓使用 Bun 的 CLI 載入得更快。

快取是全域性的,並由所有專案共享。它採用內容定址,因此不會包含重複條目。你可以隨時安全地刪除快取,即使此時有 Bun 行程正在執行。

在使用 Docker 等臨時檔案系統時,請停用此快取。Bun 的 Docker 映象會自動停用它。

停用執行環境轉譯器快取

要停用該快取,將 BUN_RUNTIME_TRANSPILER_CACHE_PATH 設定為空字串或字串 "0"。

shell
BUN_RUNTIME_TRANSPILER_CACHE_PATH=0 bun run dev

它快取什麼?

快取內容包括:

  • 大於 4 KB 的原始檔的轉譯輸出。
  • 檔案轉譯輸出的源對映。

快取檔案使用 .pile 副檔名。