#!/usr/bin/env bash # 在容器内配置 apt(amd64 主归档 + arm64 ubuntu-ports)、安装 Tauri 交叉打 deb 所需依赖、Node、Rust。 set -euxo pipefail export DEBIAN_FRONTEND=noninteractive MAIN_MIRROR="${UBUNTU_MIRROR:-http://mirrors.aliyun.com/ubuntu}" PORTS_MIRROR="${UBUNTU_PORTS_MIRROR:-http://mirrors.aliyun.com/ubuntu-ports}" retry() { local max_attempts="$1" shift local attempt=1 local delay=5 while true; do if "$@"; then return 0 fi if (( attempt >= max_attempts )); then return 1 fi echo "WARN: command failed (attempt ${attempt}/${max_attempts}), retry in ${delay}s: $*" >&2 sleep "$delay" attempt=$((attempt + 1)) delay=$((delay * 2)) done } dpkg --add-architecture arm64 # 直接重写 amd64 主仓库源,避免网络策略导致 archive.ubuntu.com 不可达。 cat > /etc/apt/sources.list < /etc/apt/sources.list.d/arm64-ports.list <&2 echo "请检查 libwebkit2gtk-4.0-dev 等是否已正确安装。" >&2 exit 1 fi done # 交叉 arm64(勿装 systemd-sysv:arm64;用 --no-install-recommends) if ! apt-get install -y --no-install-recommends \ -o Dpkg::Options::="--force-overwrite" \ gcc-aarch64-linux-gnu \ libglib2.0-dev:arm64 libgtk-3-dev:arm64 \ libbrotli-dev:arm64 \ libsoup2.4-dev:arm64 \ libcairo2-dev:arm64 libpango1.0-dev:arm64 \ libgdk-pixbuf2.0-dev:arm64 libatk1.0-dev:arm64 libepoxy-dev:arm64 \ libwebkit2gtk-4.0-dev:arm64 libjavascriptcoregtk-4.0-dev:arm64 \ libssl-dev:arm64 libayatana-appindicator3-dev:arm64 librsvg2-dev:arm64; then apt-get -f install -y apt-get install -y --no-install-recommends \ -o Dpkg::Options::="--force-overwrite" \ gcc-aarch64-linux-gnu \ libglib2.0-dev:arm64 libgtk-3-dev:arm64 \ libbrotli-dev:arm64 \ libsoup2.4-dev:arm64 \ libcairo2-dev:arm64 libpango1.0-dev:arm64 \ libgdk-pixbuf2.0-dev:arm64 libatk1.0-dev:arm64 libepoxy-dev:arm64 \ libwebkit2gtk-4.0-dev:arm64 libjavascriptcoregtk-4.0-dev:arm64 \ libssl-dev:arm64 libayatana-appindicator3-dev:arm64 librsvg2-dev:arm64 fi for f in glib-2.0.pc gdk-3.0.pc webkit2gtk-4.0.pc; do if [[ ! -f "/usr/lib/aarch64-linux-gnu/pkgconfig/${f}" ]]; then echo "ERROR: arm64 缺少 pkg-config: /usr/lib/aarch64-linux-gnu/pkgconfig/${f}" >&2 exit 1 fi done # Node.js 22(不走 NodeSource apt,避免 multiarch 下 python 依赖冲突) NODE_VERSION="v22.16.0" retry 5 curl -fsSL --connect-timeout 20 --max-time 300 \ "https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-x64.tar.xz" \ -o /tmp/node.tar.xz tar -xJf /tmp/node.tar.xz -C /opt ln -sfn "/opt/node-${NODE_VERSION}-linux-x64" /opt/node ln -sf /opt/node/bin/node /usr/local/bin/node ln -sf /opt/node/bin/npm /usr/local/bin/npm ln -sf /opt/node/bin/npx /usr/local/bin/npx rm -f /tmp/node.tar.xz export RUSTUP_HOME=/opt/rustup export CARGO_HOME=/opt/cargo mkdir -p "$RUSTUP_HOME" "$CARGO_HOME" if ! retry 5 sh -c "curl --proto '=https' --tlsv1.2 -sSf --connect-timeout 20 --max-time 300 https://sh.rustup.rs | sh -s -- -y --default-toolchain stable --no-modify-path"; then export RUSTUP_DIST_SERVER="https://rsproxy.cn" export RUSTUP_UPDATE_ROOT="https://rsproxy.cn/rustup" retry 5 sh -c "curl --proto '=https' --tlsv1.2 -sSf --connect-timeout 20 --max-time 300 https://rsproxy.cn/rustup-init.sh | sh -s -- -y --default-toolchain stable --no-modify-path" fi chmod -R a+w "$RUSTUP_HOME" "$CARGO_HOME" /opt/cargo/bin/rustup target add aarch64-unknown-linux-gnu # 非登录 shell(docker run bash -c)也能找到 cargo / rustc ln -sf /opt/cargo/bin/cargo /usr/local/bin/cargo ln -sf /opt/cargo/bin/rustc /usr/local/bin/rustc ln -sf /opt/cargo/bin/rustup /usr/local/bin/rustup rustc --version node --version cargo --version apt-get clean rm -rf /var/lib/apt/lists/*