Skip to content

Bun 会自动读取你的 .env 文件,并提供符合习惯的方法来以编程方式读取和写入环境变量。此外,Bun 运行时行为的某些方面可以使用 Bun 特定的环境变量进行配置。

设置环境变量

Bun 会自动读取以下文件(按优先级递增顺序列出)。

  • .env
  • .env.production.env.development.env.test(取决于 NODE_ENV 的值)
  • .env.local
ini
FOO=hello
BAR=world

变量也可以通过命令行设置。

sh
FOO=helloworld bun run dev
sh
# 使用 CMD
set FOO=helloworld && bun run dev

# 使用 PowerShell
$env:FOO="helloworld"; bun run dev

Windows 的跨平台解决方案

对于跨平台解决方案,你可以使用 bun shell。例如,bun exec 命令。

sh
bun exec 'FOO=helloworld bun run dev'

在 Windows 上,使用 bun run 调用的 package.json 脚本将自动使用 bun shell,使以下内容也是跨平台的。

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

或者通过为 process.env 分配属性以编程方式设置。

ts
process.env.FOO = "hello";

手动指定 .env 文件

Bun 支持 --env-file 来覆盖要加载的特定 .env 文件。你可以在 Bun 运行时运行脚本或运行 package.json 脚本时使用 --env-file

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

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

禁用自动 .env 加载

使用 --no-env-file 禁用 Bun 的自动 .env 文件加载。这在你希望仅依赖系统环境变量的生产环境或 CI/CD 管道中很有用。

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

这也可以在 bunfig.toml 中配置:

toml
# 禁用加载 .env 文件
env = false

即使禁用了默认加载,通过 --env-file 显式提供的环境文件仍将被加载。


引号

Bun 支持双引号、单引号和模板字面量反引号:

ini
FOO='hello'
FOO="hello"
FOO=`hello`

展开

环境变量会自动 展开。这意味着你可以在环境变量中引用先前定义的变量。

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

这对于构造连接字符串或其他复合值很有用。

ini
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

这可以通过用反斜杠转义 $ 来禁用。

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

dotenv

一般来说,你不再需要 dotenvdotenv-expand,因为 Bun 会自动读取 .env 文件。

读取环境变量

当前环境变量可以通过 process.env 访问。

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

Bun 还通过 Bun.envimport.meta.env 公开这些变量,这是 process.env 的简单别名。

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

要将所有当前设置的环境变量打印到命令行,运行 bun --print process.env。这对于调试很有用。

sh
bun --print process.env
BAZ=stuff
FOOBAR=aaaaaa
<lots more lines>

TypeScript

在 TypeScript 中,process.env 的所有属性都类型为 string | undefined

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

要获得自动补全并告诉 TypeScript 将变量视为非可选字符串,我们将使用 接口合并

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

将此行添加到项目中的任何文件。它将全局添加 AWESOME 属性到 process.envBun.env

ts
process.env.AWESOME; // => string

配置 Bun

这些环境变量由 Bun 读取并配置其行为的各个方面。

名称描述
NODE_TLS_REJECT_UNAUTHORIZEDNODE_TLS_REJECT_UNAUTHORIZED=0 禁用 SSL 证书验证。这对于测试和调试很有用,但你应该非常谨慎在生产中使用。注意:此环境变量最初由 Node.js 引入,我们为了兼容性保留了名称。
BUN_CONFIG_VERBOSE_FETCH如果 BUN_CONFIG_VERBOSE_FETCH=curl,则 fetch 请求会将 url、方法、请求头和响应头记录到控制台。这对于调试网络请求很有用。这也适用于 node:httpBUN_CONFIG_VERBOSE_FETCH=1 等同于 BUN_CONFIG_VERBOSE_FETCH=curl,只是没有 curl 输出。
BUN_RUNTIME_TRANSPILER_CACHE_PATH运行时转译器缓存大于 50 KB 的源文件的转译输出。这使得使用 Bun 的 CLI 加载更快。如果设置了 BUN_RUNTIME_TRANSPILER_CACHE_PATH,则运行时转译器将转译输出缓存到指定目录。如果 BUN_RUNTIME_TRANSPILER_CACHE_PATH 设置为空字符串或字符串 "0",则运行时转译器将不缓存转译输出。如果未设置 BUN_RUNTIME_TRANSPILER_CACHE_PATH,则运行时转译器将转译输出缓存到平台特定的缓存目录。
TMPDIRBun 偶尔需要目录来存储在捆绑或其他操作期间的中间资产。如果未设置,默认为平台特定的临时目录: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 上,默认启用崩溃报告上传。否则,截至 2024 年 5 月 21 日,遥测尚未发送,但我们计划在未来几周内添加遥测。如果 DO_NOT_TRACK=1,则自动上传崩溃报告和遥测都 被禁用
BUN_OPTIONS将命令行参数前置到任何 Bun 执行。例如,BUN_OPTIONS="--hot" 使 bun run dev 行为像 bun --hot run dev

运行时转译器缓存

对于大于 50 KB 的文件,Bun 将转译输出缓存到 $BUN_RUNTIME_TRANSPILER_CACHE_PATH 或平台特定的缓存目录。这使得使用 Bun 的 CLI 加载更快。

此转译器缓存是全局的,在所有项目之间共享。随时删除缓存是安全的。它是一个内容可寻址缓存,因此永远不会包含重复条目。在 Bun 进程运行时删除缓存也是安全的。

建议在使用 Docker 等临时文件系统时禁用此缓存。Bun 的 Docker 镜像自动禁用此缓存。

禁用运行时转译器缓存

要禁用运行时转译器缓存,将 BUN_RUNTIME_TRANSPILER_CACHE_PATH 设置为空字符串或字符串 "0"

sh
BUN_RUNTIME_TRANSPILER_CACHE_PATH=0 bun run dev

它缓存什么?

它缓存:

  • 大于 50 KB 的源文件的转译输出。
  • 文件转译输出的 source map

这些缓存文件使用 .pile 扩展名。

Bun学习网由www.bunjs.com.cn整理维护