diff --git a/build/linux/euler-copilot-web.spec b/build/linux/euler-copilot-web.spec index dfec1dc37e2ec28e40105de7adcd65c0c1fb80b0..56979ee20eb1edb6f9dbd91f2e9be39e1c9d2d74 100644 --- a/build/linux/euler-copilot-web.spec +++ b/build/linux/euler-copilot-web.spec @@ -23,12 +23,17 @@ License: MulanPSL-2.0 Group: Applications/Utilities Summary: openEuler 智能化解决方案 Web 前端 Source0: %{name}-%{version}.tar.gz +Source1: offline_node_modules-%{_electron_arch}.tar.zst.part0 +Source2: offline_node_modules-%{_electron_arch}.tar.zst.part1 +Source3: offline_node_modules-%{_electron_arch}.tar.zst.part2 +Source4: offline_node_modules-%{_electron_arch}.tar.zst.part3 URL: https://gitee.com/openeuler/euler-copilot-web Vendor: openEuler Packager: openEuler BuildRequires: curl +BuildRequires: zstd %description openEuler 智能化解决方案 Web 前端 @@ -57,9 +62,9 @@ openEuler 智能化解决方案桌面客户端 %build # Extract Node.js version using grep+sed for compatibility NODE_VER=$(grep '"node":' package.json | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+' | head -1) -NODE_LINK="https://registry.npmmirror.com/-/binary/node/v${NODE_VER}/node-v${NODE_VER}-linux-%{_electron_arch}.tar.xz" +NODE_LINK="https://mirrors.huaweicloud.com/nodejs/v${NODE_VER}/node-v${NODE_VER}-linux-%{_electron_arch}.tar.xz" # Download and install Node.js into a subdirectory -NODE_HOME=/usr/local/node-v${NODE_VER} +NODE_HOME="$PWD/.node-v${NODE_VER}" mkdir -p "$NODE_HOME" curl -sSL "$NODE_LINK" | tar -xJ -C "$NODE_HOME" --strip-components=1 # Set NODE_HOME and update PATH, then test Node.js installation @@ -67,16 +72,14 @@ export NODE_HOME export PATH="$NODE_HOME/bin:$PATH" node -v -# Setup mirrors for Electron -export ELECTRON_MIRROR="https://npmmirror.com/mirrors/electron/" -export ELECTRON_BUILDER_BINARIES_MIRROR="https://npmmirror.com/mirrors/electron-builder-binaries/" - # Setup npm mirror -npm config set registry https://registry.npmmirror.com +npm config set registry https://mirrors.huaweicloud.com/repository/npm/ + +# Setup mirrors for Electron +export ELECTRON_MIRROR="https://mirrors.huaweicloud.com/electron/" # Install pnpm globally -corepack enable -corepack prepare pnpm@latest --activate +npm install -g pnpm pnpm -v # Download Electron binaries to cache directory @@ -89,12 +92,23 @@ if [ ! -d "$CACHE_DIR" ]; then fi # Only download if not already present if [ ! -f "$CACHE_DIR/$PACKAGE_NAME" ]; then - curl -sSL "https://registry.npmmirror.com/-/binary/electron/$ELECTRON_VER/$PACKAGE_NAME" \ + curl -sSL "https://mirrors.huaweicloud.com/electron/$ELECTRON_VER/$PACKAGE_NAME" \ -o "$CACHE_DIR/$PACKAGE_NAME" fi +# 合并并解压离线 node_modules +cat %{_sourcedir}/offline_node_modules-%{_electron_arch}.tar.zst.part0 \ + %{_sourcedir}/offline_node_modules-%{_electron_arch}.tar.zst.part1 \ + %{_sourcedir}/offline_node_modules-%{_electron_arch}.tar.zst.part2 \ + %{_sourcedir}/offline_node_modules-%{_electron_arch}.tar.zst.part3 \ + > offline_node_modules-%{_electron_arch}.tar.zst + +if [ -f offline_node_modules-%{_electron_arch}.tar.zst ]; then + zstd -d offline_node_modules-%{_electron_arch}.tar.zst -c | tar -xf - +fi + # Install pnpm packages -pnpm install +# pnpm install --offline # Build the app pnpm run package:linux diff --git a/build/scripts/build_rpm.sh b/build/scripts/build_rpm.sh index 3ede947abcdb7aa56f4914c9b4203c6d8f9afe15..f7dffafe247afd6a34fed33b127f1872f433fc80 100755 --- a/build/scripts/build_rpm.sh +++ b/build/scripts/build_rpm.sh @@ -34,6 +34,28 @@ if [ ! -f "${tarball_path}" ]; then bash "${SCRIPT_DIR}/package_repository.sh" fi +# 1.5 检测架构并准备离线 node 依赖 +ARCH=$(uname -m) +if [[ "$ARCH" == "x86_64" ]]; then + ARCH_SUFFIX="x64" +elif [[ "$ARCH" == "aarch64" ]]; then + ARCH_SUFFIX="arm64" +else + echo "不支持的架构: $ARCH" >&2 + exit 2 +fi +# 检查 node_modules 分块文件是否存在,不存在则生成 +NEED_GEN=0 +for i in 0 1 2 3; do + if [ ! -f "${RELEASE_DIR}/offline_node_modules-${ARCH_SUFFIX}.tar.zst.part${i}" ]; then + NEED_GEN=1 + fi +done +if [ "$NEED_GEN" -eq 1 ]; then + echo "生成离线依赖..." + bash "${SCRIPT_DIR}/prepare_node_modules_offline.sh" +fi + # 2. 初始化 rpmbuild 目录到 release 目录 RPMBUILD_DIR="${RELEASE_DIR}/rpmbuild" mkdir -p "${RPMBUILD_DIR}"/{BUILD,RPMS,SOURCES,SPECS,SRPMS} @@ -42,8 +64,17 @@ mkdir -p "${RPMBUILD_DIR}"/{BUILD,RPMS,SOURCES,SPECS,SRPMS} cp "${SPEC}" "${RPMBUILD_DIR}/SPECS/" cp "${tarball_path}" "${RPMBUILD_DIR}/SOURCES/" +# 3.5 复制离线依赖包分块到 SOURCES +for i in 0 1 2 3; do + cp "${RELEASE_DIR}/offline_node_modules-${ARCH_SUFFIX}.tar.zst.part${i}" "${RPMBUILD_DIR}/SOURCES/" +done + # 4. 执行 rpmbuild echo "开始构建 RPM 包..." rpmbuild --define "_topdir ${RPMBUILD_DIR}" -ba "${RPMBUILD_DIR}/SPECS/$(basename "${SPEC}")" echo "RPM 包构建完成,输出在 ${RPMBUILD_DIR}/RPMS 和 ${RPMBUILD_DIR}/SRPMS" + +# 移动构建好的 rpm 包到 release 目录 +find "${RPMBUILD_DIR}/RPMS" -type f -name '*.rpm' -exec cp -f {} "${RELEASE_DIR}/" \; +echo "所有 RPM 包已移动到 ${RELEASE_DIR}" diff --git a/build/scripts/prepare_node_modules_offline.sh b/build/scripts/prepare_node_modules_offline.sh new file mode 100755 index 0000000000000000000000000000000000000000..4f3d96b6219d684dc3c75e53d25c14e01f59407c --- /dev/null +++ b/build/scripts/prepare_node_modules_offline.sh @@ -0,0 +1,55 @@ +#!/bin/bash +# build/scripts/prepare_node_modules_offline.sh +# 用于在有网环境下准备 node_modules 和 pnpm 缓存,实现离线安装 +# 用法:在有网环境下运行一次,生成 release/offline_node_modules.tar.gz 和 release/offline_pnpm_store.tar.gz + +set -e + +WORKDIR=$(cd "$(dirname "$0")/../.." && pwd) +cd "$WORKDIR" + +RELEASE_DIR="$WORKDIR/release" +mkdir -p "$RELEASE_DIR" + +# 0. 确保已安装 pnpm +if ! command -v pnpm >/dev/null 2>&1; then + echo "未检测到 pnpm,正在全局安装..." + npm install -g pnpm +fi + +# 1. 检测架构 +ARCH=$(uname -m) +if [[ "$ARCH" == "x86_64" ]]; then + ARCH_SUFFIX="x64" +elif [[ "$ARCH" == "aarch64" ]]; then + ARCH_SUFFIX="arm64" +else + echo "不支持的架构: $ARCH" >&2 + exit 2 +fi + +# 2. 在 RELEASE_DIR 下创建快照缓存目录 +CACHE_DIR="$RELEASE_DIR/offline_build_cache_$ARCH_SUFFIX" +rm -rf "$CACHE_DIR" +mkdir -p "$CACHE_DIR" + +# 3. 拷贝当前代码仓内容到缓存目录(排除 .git、release、node_modules、pnpm-lock.yaml) +rsync -a --exclude='.git' --exclude='release' --exclude='node_modules' --exclude='pnpm-lock.yaml' ./ "$CACHE_DIR/" +cd "$CACHE_DIR" + +# 3. 安装依赖 +pnpm install + +# 4. 打包 node_modules 及 pnpm-lock.yaml,并分割为4个分块 +if [ -d node_modules ]; then + if [ -f pnpm-lock.yaml ]; then + tar -cf - node_modules pnpm-lock.yaml | zstd -19 -T0 -o "$RELEASE_DIR/offline_node_modules-$ARCH_SUFFIX.tar.zst" + else + tar -cf - node_modules | zstd -19 -T0 -o "$RELEASE_DIR/offline_node_modules-$ARCH_SUFFIX.tar.zst" + fi + # 分割为4个分块 + split -d -n 4 -a 1 "$RELEASE_DIR/offline_node_modules-$ARCH_SUFFIX.tar.zst" "$RELEASE_DIR/offline_node_modules-$ARCH_SUFFIX.tar.zst.part" + rm -f "$RELEASE_DIR/offline_node_modules-$ARCH_SUFFIX.tar.zst" +fi + +echo "已生成 offline_node_modules-$ARCH_SUFFIX.tar.zst.part[0-3],可用于离线环境。"