#!/usr/bin/env bash # 在 Ubuntu 24.04.x(x86_64 宿主机)上为多个 Tauri 2 + Vue 项目打出 amd64 与 arm64 的 .deb。 # # 依赖(示例,按 Tauri Linux 文档补齐): # - Node/npm、Rust、@tauri-apps/cli # - rustup target add aarch64-unknown-linux-gnu # - 本机 amd64 与交叉 arm64 的 libwebkit2gtk、gtk 等 -dev 包及 pkg-config 布局 # # 用法: # ./scripts/build-linux-deb-all.sh # 构建 PROJECTS 中全部项目 # ./scripts/build-linux-deb-all.sh call-client # 仅构建指定项目(可多个) # set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" # --------------------------------------------------------------------------- # 同框架项目列表(相对 REPO_ROOT 的目录名)。后续新增项目在此追加一行即可。 # --------------------------------------------------------------------------- PROJECTS=( "call-client" "broadcast-client" # "another-tauri-app" ) # 统一收集 .deb 的根目录(相对 REPO_ROOT) OUTPUT_ROOT="$REPO_ROOT/dist/linux-deb" build_one_target() { local project_dir="$1" local npm_cmd="$2" local abs_project="$REPO_ROOT/$project_dir" if [[ ! -f "$abs_project/package.json" ]]; then echo "错误: 未找到项目 $project_dir(缺少 package.json)" >&2 exit 1 fi echo "==> [$project_dir] $npm_cmd" (cd "$abs_project" && npm run "$npm_cmd") } collect_debs() { local project_dir="$1" local arch_label="$2" local triple="$3" local src="$REPO_ROOT/$project_dir/src-tauri/target/$triple/release/bundle/deb" local dest="$OUTPUT_ROOT/$project_dir/$arch_label" if [[ ! -d "$src" ]]; then echo "警告: 未找到输出目录 $src(跳过复制)" >&2 return 0 fi mkdir -p "$dest" shopt -s nullglob local files=( "$src"/*.deb ) shopt -u nullglob if (( ${#files[@]} == 0 )); then echo "警告: $src 下没有 .deb 文件" >&2 return 0 fi cp -v "${files[@]}" "$dest/" } build_project() { local project_dir="$1" echo "" echo "######## $project_dir: amd64 ########" unset PKG_CONFIG_PATH PKG_CONFIG_LIBDIR PKG_CONFIG_SYSROOT_DIR PKG_CONFIG_ALLOW_CROSS 2>/dev/null || true build_one_target "$project_dir" "build:deb:x64" collect_debs "$project_dir" "amd64" "x86_64-unknown-linux-gnu" echo "" echo "######## $project_dir: arm64 (cross) ########" export PKG_CONFIG_ALLOW_CROSS=1 export PKG_CONFIG_SYSROOT_DIR=/ export PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig export PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig build_one_target "$project_dir" "build:deb:arm64" collect_debs "$project_dir" "arm64" "aarch64-unknown-linux-gnu" unset PKG_CONFIG_ALLOW_CROSS PKG_CONFIG_SYSROOT_DIR PKG_CONFIG_PATH PKG_CONFIG_LIBDIR } select_projects() { if (($# == 0)); then printf '%s\n' "${PROJECTS[@]}" return fi local name ok for name in "$@"; do ok=0 for p in "${PROJECTS[@]}"; do if [[ "$p" == "$name" ]]; then ok=1 break fi done if [[ "$ok" -eq 0 ]]; then echo "错误: 未知项目 \"$name\"(请加入 scripts/build-linux-deb-all.sh 的 PROJECTS 数组)" >&2 exit 1 fi echo "$name" done } main() { mapfile -t to_build < <(select_projects "$@") mkdir -p "$OUTPUT_ROOT" for p in "${to_build[@]}"; do build_project "$p" done echo "" echo "==> 全部完成" echo " 统一输出目录: $OUTPUT_ROOT" echo " 每项目下: <项目名>/amd64/*.deb 与 <项目名>/arm64/*.deb" echo " Tauri 原始路径仍在各项目:" echo " src-tauri/target/x86_64-unknown-linux-gnu/release/bundle/deb/" echo " src-tauri/target/aarch64-unknown-linux-gnu/release/bundle/deb/" } main "$@"