#!/usr/bin/env bash # Shared profile detection for non-Docker installs and updates. # Strong machines use the default npm/Next behavior. Small machines trade time # for lower peak CPU and memory usage. JBOARD_STANDALONE_PROFILE_RESOLVED="" JBOARD_CPU_COUNT="" JBOARD_HOST_MEM_MB="" JBOARD_APP_DISK_AVAIL_MB="" JBOARD_BUILD_NODE_HEAP_MB="" JBOARD_RUNTIME_NODE_HEAP_MB="" JBOARD_RUNTIME_NODE_OPTIONS="" jboard_cpu_count() { local value="" if command -v nproc >/dev/null 2>&1; then value="$(nproc 2>/dev/null || true)" elif command -v getconf >/dev/null 2>&1; then value="$(getconf _NPROCESSORS_ONLN 2>/dev/null || true)" elif command -v sysctl >/dev/null 2>&1; then value="$(sysctl -n hw.ncpu 2>/dev/null || true)" fi case "$value" in ''|*[!0-9]*) echo 1 ;; *) echo "$value" ;; esac } jboard_host_mem_mb() { local value="" if [ -r /proc/meminfo ]; then value="$(awk '/^MemTotal:/ {print int($2 / 1024)}' /proc/meminfo 2>/dev/null || true)" elif command -v getconf >/dev/null 2>&1; then local pages page_size pages="$(getconf _PHYS_PAGES 2>/dev/null || true)" page_size="$(getconf PAGE_SIZE 2>/dev/null || true)" if [ -n "$pages" ] && [ -n "$page_size" ]; then value="$((pages * page_size / 1024 / 1024))" fi elif command -v sysctl >/dev/null 2>&1; then local bytes bytes="$(sysctl -n hw.memsize 2>/dev/null || true)" if [ -n "$bytes" ]; then value="$((bytes / 1024 / 1024))" fi fi case "$value" in ''|*[!0-9]*) echo 0 ;; *) echo "$value" ;; esac } jboard_path_avail_mb() { local path="$1" local value="" if [ -n "$path" ]; then value="$(df -Pm "$path" 2>/dev/null | awk 'NR == 2 {print $4}' || true)" fi case "$value" in ''|*[!0-9]*) echo 0 ;; *) echo "$value" ;; esac } jboard_standalone_build_heap_mb() { local mem_mb="$1" if [ -n "${JBOARD_LOW_RESOURCE_NODE_MB:-}" ]; then echo "$JBOARD_LOW_RESOURCE_NODE_MB" return fi if [ "$mem_mb" -gt 0 ] && [ "$mem_mb" -le 1200 ]; then echo 640 elif [ "$mem_mb" -gt 0 ] && [ "$mem_mb" -le 1700 ]; then echo 768 elif [ "$mem_mb" -gt 0 ] && [ "$mem_mb" -le 2400 ]; then echo 1024 else echo 1536 fi } jboard_standalone_runtime_heap_mb() { local mem_mb="$1" if [ -n "${JBOARD_RUNTIME_NODE_MB:-}" ]; then echo "$JBOARD_RUNTIME_NODE_MB" return fi if [ "$mem_mb" -gt 0 ] && [ "$mem_mb" -le 1200 ]; then echo 512 elif [ "$mem_mb" -gt 0 ] && [ "$mem_mb" -le 1700 ]; then echo 768 elif [ "$mem_mb" -gt 0 ] && [ "$mem_mb" -le 2400 ]; then echo 1024 else echo "" fi } jboard_resolve_standalone_profile() { local requested="${JBOARD_BUILD_PROFILE:-auto}" local cpu="$1" local mem_mb="$2" local disk_mb="$3" case "$requested" in low|slow|small) echo low return ;; normal|fast|strong) echo normal return ;; auto|'') ;; *) echo "未知 JBOARD_BUILD_PROFILE=$requested,回退为 auto。" >&2 ;; esac if [ "$cpu" -le 1 ]; then echo low elif [ "$mem_mb" -gt 0 ] && [ "$mem_mb" -lt 2048 ]; then echo low elif [ "$disk_mb" -gt 0 ] && [ "$disk_mb" -lt 8192 ]; then echo low else echo normal fi } jboard_prepare_standalone_build_env() { local app_dir="${1:-.}" JBOARD_CPU_COUNT="$(jboard_cpu_count)" JBOARD_HOST_MEM_MB="$(jboard_host_mem_mb)" JBOARD_APP_DISK_AVAIL_MB="$(jboard_path_avail_mb "$app_dir")" JBOARD_STANDALONE_PROFILE_RESOLVED="$(jboard_resolve_standalone_profile "$JBOARD_CPU_COUNT" "$JBOARD_HOST_MEM_MB" "$JBOARD_APP_DISK_AVAIL_MB")" export NEXT_TELEMETRY_DISABLED=1 if [ "$JBOARD_STANDALONE_PROFILE_RESOLVED" = "low" ]; then JBOARD_BUILD_NODE_HEAP_MB="$(jboard_standalone_build_heap_mb "$JBOARD_HOST_MEM_MB")" JBOARD_RUNTIME_NODE_HEAP_MB="$(jboard_standalone_runtime_heap_mb "$JBOARD_HOST_MEM_MB")" JBOARD_RUNTIME_NODE_OPTIONS="--max-old-space-size=${JBOARD_RUNTIME_NODE_HEAP_MB}" export NPM_CONFIG_JOBS="${NPM_CONFIG_JOBS:-1}" export npm_config_jobs="${npm_config_jobs:-$NPM_CONFIG_JOBS}" export NODE_OPTIONS="${NODE_OPTIONS:---max-old-space-size=${JBOARD_BUILD_NODE_HEAP_MB}}" else JBOARD_BUILD_NODE_HEAP_MB="" JBOARD_RUNTIME_NODE_HEAP_MB="" JBOARD_RUNTIME_NODE_OPTIONS="${JBOARD_RUNTIME_NODE_OPTIONS:-}" export NPM_CONFIG_JOBS="${NPM_CONFIG_JOBS:-}" fi } jboard_is_low_resource_standalone() { [ "${JBOARD_STANDALONE_PROFILE_RESOLVED:-}" = "low" ] } jboard_print_standalone_profile() { local disk="${JBOARD_APP_DISK_AVAIL_MB:-0}" local disk_text="unknown" if [ "$disk" -gt 0 ]; then disk_text="${disk}MB" fi if jboard_is_low_resource_standalone; then echo "检测到低资源本机环境:CPU=${JBOARD_CPU_COUNT:-?},内存=${JBOARD_HOST_MEM_MB:-0}MB,可用空间=${disk_text}" echo "启用慢速低占用模式:npm jobs=${NPM_CONFIG_JOBS:-1},构建 Node heap=${JBOARD_BUILD_NODE_HEAP_MB:-?}MB,运行 Node heap=${JBOARD_RUNTIME_NODE_HEAP_MB:-?}MB。" else echo "检测到常规本机环境:CPU=${JBOARD_CPU_COUNT:-?},内存=${JBOARD_HOST_MEM_MB:-0}MB,可用空间=${disk_text}" echo "使用 npm/Next 默认构建策略,不额外限制并发或 Node heap。" fi if [ "$disk" -gt 0 ] && [ "$disk" -lt 8192 ]; then echo "提示:可用空间低于 8GB,建议扩容或清理缓存后再构建。" fi }