根據您的網路連線和電腦速度,為 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.dev.org.tw/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 中執行多執行緒程式碼(例如 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 建置版本可能無法在其他系統上執行。