Bun

貢獻

根據您的網路連線和電腦速度,為 Bun 設定開發環境可能需要 10-30 分鐘。您將需要約 10GB 的可用磁碟空間,用於存放儲存庫和建置產出。

如果您使用 Windows,請參閱此指南

安裝相依性

使用系統的套件管理員,安裝 Bun 的相依性

macOS
Ubuntu/Debian
Arch
Fedora
openSUSE
macOS
brew install automake ccache cmake coreutils gnu-sed go icu4c libiconv libtool ninja pkg-config rust ruby
Ubuntu/Debian
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
Arch
sudo pacman -S base-devel ccache cmake git go libiconv libtool make ninja pkg-config python rust sed unzip ruby
Fedora
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)'
openSUSE
sudo zypper install go cmake ninja automake git rustup && rustup toolchain install stable

注意:Zig 編譯器會由建置指令碼自動安裝和更新。不需要手動安裝。

在開始之前,您需要已經安裝 Bun 的發行版本,因為我們使用我們的打包器來轉譯和縮小我們的程式碼,以及用於程式碼產生指令碼。

原生
npm
Homebrew
原生
curl -fsSL https://bun.dev.org.tw/install | bash
npm
npm install -g bun
Homebrew
brew tap oven-sh/bun
brew install bun

安裝 LLVM

Bun 需要 LLVM 16(clang 是 LLVM 的一部分)。此版本要求與(預編譯的)WebKit 相符,因為版本不符會導致執行時期的記憶體配置失敗。在大部分情況下,你可以透過系統套件管理員安裝 LLVM

macOS
Ubuntu/Debian
Arch
Fedora
openSUSE
macOS
brew install llvm@16
Ubuntu/Debian
# 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
Arch
sudo pacman -S llvm clang lld
Fedora
sudo dnf install 'dnf-command(copr)'
sudo dnf copr enable -y @fedora-llvm-team/llvm-snapshots
sudo dnf install llvm clang lld
openSUSE
sudo zypper install clang16 lld16 llvm16

如果上述解決方案都不適用,你必須手動安裝它。

確保 Clang/LLVM 16 在你的路徑中

which clang-16

如果沒有,執行此指令手動加入

macOS
Arch
macOS
# 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"
Arch
# 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

這兩個指令碼,setupbuild,是別名,大致上執行下列動作

./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++ 樣板。產生的程式碼存在於

make codegen

最後,我們還有一個程式碼產生指令碼,用於我們的原生串流實作。若要執行它,請執行

make generate-sink

你可能不需要執行它很多次。

修改 ESM 模組

某些模組,例如 node:fsnode:streambun:sqlitews,是用 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 中執行多執行緒程式碼(例如 bundler),則需要 --fair-sched=try。否則它會掛起。

valgrind --fair-sched=try --track-origins=yes bun-debug <args>

在本地建置 WebKit + JSC 的偵錯模式

待辦事項:這已過時。簡而言之,將 -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 建置版本可能無法在其他系統上執行。