Files
J-Board-Lite/scripts/lib-standalone-profile.sh
2026-05-01 01:50:37 +10:00

192 lines
5.3 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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
}