#!/usr/bin/env bash## Build a self-contained CodeGraph bundle: an official Node runtime + the# compiled app + its production deps, so CodeGraph runs with NO system Node and# NO native build — node:sqlite is built into the bundled Node. One archive per# platform.## Because dropping better-sqlite3 left zero native addons, the recipe is pure# file-packaging (download the target's Node, copy the app, archive) — so any# platform's bundle can be built on any OS. No cross-compile, no native runners.## Usage:# scripts/build-bundle.sh <target> [node-version]# target: darwin-arm64 | darwin-x64 | linux-x64 | linux-arm64# | win32-x64 | win32-arm64# node-version: e.g. v24.16.0 (default below; pin for reproducible builds)## Output:# unix: release/codegraph-<target>.tar.gz (launcher: bin/codegraph)# windows: release/codegraph-<target>.zip (launcher: bin/codegraph.cmd)set -euo pipefailTARGET="${1:?usage: build-bundle.sh <target> [node-version]}"NODE_VERSION="${2:-v24.16.0}"ROOT="$(cd "$(dirname "0ドル")/.." && pwd)"OUT="$ROOT/release"WORK="$(mktemp -d)"trap 'rm -rf "$WORK"' EXITARCH="${TARGET##*-}" # x64 | arm64OSFAM="${TARGET%-*}" # darwin | linux | win32echo "[bundle] target=${TARGET} node=${NODE_VERSION}"# 1. Download + extract the official Node runtime for the target platform.if [ "$OSFAM" = "win32" ]; thenNODE_DIST="node-${NODE_VERSION}-win-${ARCH}"NODE_URL="https://nodejs.org/dist/${NODE_VERSION}/${NODE_DIST}.zip"echo "[bundle] downloading ${NODE_URL}"curl -fsSL "$NODE_URL" -o "$WORK/node.zip"if command -v unzip >/dev/null 2>&1; thenunzip -q "$WORK/node.zip" -d "$WORK"elsetar -xf "$WORK/node.zip" -C "$WORK" # bsdtar can read zipfiNODE_BIN="$WORK/${NODE_DIST}/node.exe"elseNODE_DIST="node-${NODE_VERSION}-${TARGET}"NODE_URL="https://nodejs.org/dist/${NODE_VERSION}/${NODE_DIST}.tar.gz"echo "[bundle] downloading ${NODE_URL}"curl -fsSL "$NODE_URL" -o "$WORK/node.tar.gz"tar -xzf "$WORK/node.tar.gz" -C "$WORK"NODE_BIN="$WORK/${NODE_DIST}/bin/node"fi[ -f "$NODE_BIN" ] || { echo "[bundle] error: node binary not found ($NODE_BIN)" >&2; exit 1; }# 2. Build the app (compiled JS + copied wasm/schema assets).echo "[bundle] building app"( cd "$ROOT" && npm run build >/dev/null )# 3. Stage: app + production-only deps (pure JS/wasm → portable across platforms).STAGE="$WORK/codegraph-${TARGET}"mkdir -p "$STAGE/lib" "$STAGE/bin"cp -R "$ROOT/dist" "$STAGE/lib/dist"cp "$ROOT/package.json" "$ROOT/package-lock.json" "$STAGE/lib/"echo "[bundle] installing production dependencies"( cd "$STAGE/lib" && npm ci --omit=dev --ignore-scripts >/dev/null 2>&1 )rm -f "$STAGE/lib/package-lock.json"# 4. Vendored Node + launcher (the launcher uses the bundled Node by relative# path, so no system Node is ever needed).## `--liftoff-only`: keep tree-sitter's large WASM grammars on V8's Liftoff# baseline compiler so they never reach the turboshaft optimizing tier, whose# per-compilation Zone arena OOMs the whole process (`Fatal process out of# memory: Zone`) on Node >= 22 — even with tens of GB free. The flag is read at# V8 engine init so it must be on node's command line; the parse worker inherits# it. See issues #293/#298 and src/extraction/wasm-runtime-flags.ts. (The CLI# also self-relaunches with this flag when launched without it, so non-bundled# runs are covered too; passing it here avoids that extra spawn.)if [ "$OSFAM" = "win32" ]; thencp "$NODE_BIN" "$STAGE/node.exe"printf '@"%%~dp0..\\node.exe" --liftoff-only "%%~dp0..\\lib\\dist\\bin\\codegraph.js" %%*\r\n' \> "$STAGE/bin/codegraph.cmd"elsecp "$NODE_BIN" "$STAGE/node"cat > "$STAGE/bin/codegraph" <<'LAUNCH'#!/bin/sh# Resolve symlinks (e.g. the ~/.local/bin/codegraph link install.sh creates) so# we find the real bundle dir, not the symlink's location.SELF="0ドル"while [ -L "$SELF" ]; dotarget="$(readlink "$SELF")"case "$target" in/*) SELF="$target" ;;*) SELF="$(dirname "$SELF")/$target" ;;esacdoneDIR="$(cd "$(dirname "$SELF")/.." && pwd)"# --liftoff-only: avoid the V8 turboshaft WASM Zone OOM (issues #293/#298).exec "$DIR/node" --liftoff-only "$DIR/lib/dist/bin/codegraph.js" "$@"LAUNCHchmod +x "$STAGE/bin/codegraph"fi# 5. Archive (.zip for Windows, .tar.gz otherwise).mkdir -p "$OUT"if [ "$OSFAM" = "win32" ]; thenARCHIVE="$OUT/codegraph-${TARGET}.zip"rm -f "$ARCHIVE"( cd "$WORK" && zip -rqX "$ARCHIVE" "codegraph-${TARGET}" )elseARCHIVE="$OUT/codegraph-${TARGET}.tar.gz"# --no-xattrs: don't embed macOS xattrs that make GNU tar warn on Linux.tar --no-xattrs -czf "$ARCHIVE" -C "$WORK" "codegraph-${TARGET}"fiecho "[bundle] wrote ${ARCHIVE} ($(du -h "$ARCHIVE" | cut -f1))"
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。