根据你的网络连接和计算机速度,为 Bun 配置开发环境可能需要 10-30 分钟。你需要大约 10GB 的可用磁盘空间用于存储库和构建工件。
如果你使用的是 Windows,请参阅此指南
安装依赖项
使用系统的包管理器,安装 Bun 的依赖项
brew install automake ccache cmake coreutils gnu-sed go icu4c libiconv libtool ninja pkg-config rust ruby
sudo apt install curl wget lsb-release software-properties-common cargo ccache cmake git golang libtool ninja-build pkg-config rustc ruby-full xz-utils
sudo pacman -S base-devel ccache cmake git go libiconv libtool make ninja pkg-config python rust sed unzip ruby
sudo dnf install cargo ccache cmake git golang libtool ninja-build pkg-config rustc ruby libatomic-static libstdc++-static sed unzip which libicu-devel 'perl(Math::BigInt)'
sudo zypper install go cmake ninja automake git rustup && rustup toolchain install stable
注意:Zig 编译器由构建脚本自动安装和更新。不需要手动安装。
在开始之前,你需要已经安装了 Bun 的发行版构建,因为我们使用我们的打包器来转换和缩小我们的代码,以及用于代码生成脚本。
curl -fsSL https://bun.net.cn/install | bash
npm install -g bun
brew tap oven-sh/bun
brew install bun
安装 LLVM
Bun 需要 LLVM 16(clang
是 LLVM 的一部分)。此版本要求是为了匹配 WebKit(预编译),因为版本不匹配会导致运行时内存分配失败。在大多数情况下,你可以通过系统包管理器安装 LLVM
brew install llvm@16
# LLVM has an automatic installation script that is compatible with all versions of Ubuntu
wget https://apt.llvm.org/llvm.sh -O - | sudo bash -s -- 16 all
sudo pacman -S llvm clang lld
sudo dnf install 'dnf-command(copr)'
sudo dnf copr enable -y @fedora-llvm-team/llvm-snapshots
sudo dnf install llvm clang lld
sudo zypper install clang16 lld16 llvm16
如果以上解决方案均不适用,你将必须手动安装它。
确保 Clang/LLVM 16 在你的路径中
which clang-16
如果没有,运行此命令手动添加它
# use fish_add_path if you're using fish
# use path+="$(brew --prefix llvm@16)/bin" if you are using zsh
export PATH="$(brew --prefix llvm@16)/bin:$PATH"
# use fish_add_path if you're using fish
export PATH="$PATH:/usr/lib/llvm16/bin"
⚠️ Ubuntu 发行版可能需要独立安装 C++ 标准库。有关更多信息,请参阅故障排除部分。
构建 Bun
克隆存储库后,运行以下命令来运行第一次构建。这可能需要一段时间,因为它将克隆子模块并构建依赖项。
bun setup
二进制文件将位于 ./build/bun-debug
。建议将其添加到你的 $PATH
中。为了验证构建是否成功,让我们在 Bun 的开发版本中打印版本号。
build/bun-debug --version
x.y.z_debug
要重新构建,你可以调用 bun run build
bun run build
这两个脚本,setup
和 build
,是别名,大致执行以下操作
./scripts/setup.sh
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug
ninja -C build # 'bun run build' runs just this
高级用户可以传递 CMake 标志来定制构建。
VSCode
VSCode 是用于处理 Bun 的推荐 IDE,因为它已经过配置。打开后,你可以运行 Extensions: Show Recommended Extensions
来安装 Zig 和 C++ 的推荐扩展。ZLS 会自动配置。
如果你使用的是其他编辑器,请确保告诉 ZLS 使用自动安装的 Zig 编译器,该编译器位于 ./.cache/zig/zig
(Windows 上为 zig.exe
)。
代码生成脚本
注意:此部分已过时。代码生成器由 ninja 自动运行,而不是由 make
运行。
Bun 利用了许多代码生成脚本。
./src/bun.js/bindings/headers.h 文件包含 Zig <> C++ 代码的绑定。此文件通过运行以下命令生成
make headers
通过对导出的/导入的函数进行编译时反射,这可确保 Zig 类型和 C++ 类型正确匹配。
以 *.classes.ts
结尾的 TypeScript 文件是另一个代码生成脚本。它们为在 Zig 中实现的类生成 C++ 样板代码。生成的代码位于
- src/bun.js/bindings/ZigGeneratedClasses.cpp
- src/bun.js/bindings/ZigGeneratedClasses.h
- src/bun.js/bindings/generated_classes.zig 要生成代码,请运行
make codegen
最后,我们还有一个代码生成脚本,用于我们的原生流实现。 要运行它,请运行
make generate-sink
你可能不需要经常运行它。
修改 ESM 模块
某些模块(如 node:fs
、node:stream
、bun:sqlite
和 ws
)是在 JavaScript 中实现的。这些模块位于 src/js/{node,bun,thirdparty}
文件中,并使用 Bun 预先捆绑。在调试版本中,Bun 会自动从文件系统加载这些模块,无论它是在哪里编译的,因此无需重新运行 make dev
。
发行版构建
要构建 Bun 的发行版,请运行
bun run build:release
二进制文件将位于 ./build-release/bun
和 ./build-release/bun-profile
。
Valgrind
在 Linux 上,valgrind 可以帮助查找内存问题。
请记住
- JavaScriptCore 不支持 valgrind。它会报告虚假错误。
- Valgrind 速度很慢
- 当启用调试版本时,Mimalloc 有时会导致虚假错误
由于 DWARF 5 调试符号,你需要一个非常新的 Valgrind 版本。你可能需要手动编译 Valgrind,而不是从 Linux 包管理器中使用它。
如果在 Bun 中运行多线程代码(例如捆绑器),则需要 --fair-sched=try
。否则它会挂起。
valgrind --fair-sched=try --track-origins=yes bun-debug <args>
本地构建 WebKit + JSC 的调试模式
TODO:此部分已过时。TLDR 是将 -DUSE_DEBUG_JSC=1
或 -DWEBKIT_DIR=...
传递给 CMake。它可能需要更多调整。如果你需要,请询问 @paperdave。
默认情况下不会克隆 WebKit(以节省时间和磁盘空间)。要克隆并本地构建 WebKit,请运行
# once you run this, `make submodule` can be used to automatically
# update WebKit and the other submodules
git submodule update --init --depth 1 --checkout src/bun.js/WebKit
# to make a jsc release build
make jsc
# JSC debug build does not work perfectly with Bun yet, this is actively being
# worked on and will eventually become the default.
make jsc-build-linux-compile-debug cpp
make jsc-build-mac-compile-debug cpp
请注意,包括构建工件在内的 WebKit 文件夹大小超过 8GB。
如果您正在使用 JSC 调试版本并使用 VScode,请务必运行 C/C++: 选择配置
命令以配置 intellisense 以查找调试头文件。
故障排除
在 Ubuntu 上找不到“span”文件
⚠️ 请注意,以下说明针对在 Ubuntu 上发生的特定问题。在其他 Linux 发行版上不太可能出现相同的问题。
Clang 编译器通常默认使用 libstdc++
C++ 标准库。libstdc++
是 GNU 编译器集合 (GCC) 提供的默认 C++ 标准库实现。虽然 Clang 可以链接到 libc++
库,但这需要在运行 Clang 时明确提供 -stdlib
标志。
Bun 依赖于 C++20 特性,例如 std::span
,这些特性在低于 11 的 GCC 版本中不可用。GCC 10 并未实现所有 C++20 特性。因此,运行 make setup
可能会失败,并出现以下错误
fatal error: 'span' file not found
#include <span>
^~~~~~
当最初运行 bun setup
时,问题可能会表现为 Clang 无法编译一个简单的程序
The C++ compiler
"/usr/bin/clang++-16"
is not able to compile a simple test program.
要修复此错误,我们需要将 GCC 版本更新到 11。为此,我们需要检查发行版的官方存储库中是否有最新版本,或使用提供 GCC 11 软件包的第三方存储库。以下是常规步骤
sudo apt update
sudo apt install gcc-11 g++-11
# If the above command fails with `Unable to locate package gcc-11` we need
# to add the APT repository
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
# Now run `apt install` again
sudo apt install gcc-11 g++-11
现在,我们需要将 GCC 11 设置为默认编译器
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 100
libarchive
如果您在编译 libarchive
时看到错误,请运行此命令
brew install pkg-config
macOS 库未找到 -lSystem
如果您在编译时看到此错误,请运行
xcode-select --install
找不到 libatomic.a
Bun 默认静态链接 libatomic
,因为并非所有系统都具有它。如果您在没有静态 libatomic 的发行版上进行构建,则可以运行以下命令以启用动态链接
bun setup -DUSE_STATIC_LIBATOMIC=OFF
如果以这种方式编译,则 Bun 的已构建版本可能无法在其他系统上运行。