From fe4fe7c7772ccdce388e9500236c8a9efe809ece Mon Sep 17 00:00:00 2001 From: JianFeeeee <109188060+JianFeeeee@users.noreply.github.com> Date: Wed, 15 Apr 2026 06:49:49 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E6=81=A2=E5=A4=8Dbuild=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=A4=B9=E4=B8=8B=E7=9A=84=E6=89=93=E5=8C=85=E8=84=9A?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 恢复在提交 87196fd 中误删的打包脚本文件:build_linux.sh, build_macos.sh, build_windows.bat, trulymem.spec 🤖 Generated with CodeArts Agent --- build/build_linux.sh | 83 +++++++++++++++++++++++++++++++++++++ build/build_macos.sh | 90 ++++++++++++++++++++++++++++++++++++++++ build/build_windows.bat | 60 +++++++++++++++++++++++++++ build/trulymem.spec | 92 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 325 insertions(+) create mode 100755 build/build_linux.sh create mode 100644 build/build_macos.sh create mode 100644 build/build_windows.bat create mode 100644 build/trulymem.spec diff --git a/build/build_linux.sh b/build/build_linux.sh new file mode 100755 index 0000000..9992439 --- /dev/null +++ b/build/build_linux.sh @@ -0,0 +1,83 @@ +#!/bin/bash +set -e + +echo "===== Building TrulyMEM for Linux =====" + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" +cd "$PROJECT_ROOT" + +echo "Project root: $PROJECT_ROOT" + +if ! command -v python3 &> /dev/null; then + echo "Error: python3 not found" + exit 1 +fi + +# 创建并激活虚拟环境 +VENV_DIR="$PROJECT_ROOT/.venv_build" + +echo "Creating virtual environment: $VENV_DIR" +python3 -m venv "$VENV_DIR" + +echo "Activating virtual environment..." +source "$VENV_DIR/bin/activate" + +echo "Upgrading pip in virtual environment..." +pip install --upgrade pip + +echo "Installing dependencies in virtual environment..." +pip install -r requirements.txt + +echo "Cleaning previous builds..." +rm -rf build/dist build/__pycache__ 2>/dev/null || true + +echo "Running PyInstaller..." +python -m PyInstaller trulymem_entry.py \ + --clean \ + --onefile \ + --console \ + --name TrulyMEM \ + --add-data "ui/styles:ui/styles" \ + --add-data "core/prompts/templates:core/prompts/templates" \ + --hidden-import textual \ + --hidden-import textual.app \ + --hidden-import textual.widgets \ + --hidden-import textual.css \ + --hidden-import openai \ + --hidden-import openai._client \ + --hidden-import neo4j \ + --hidden-import sqlite3 \ + --hidden-import core \ + --hidden-import core.embedded_db \ + --hidden-import core.graph_client \ + --hidden-import core.tool_executor \ + --hidden-import core.tool_limiter \ + --hidden-import core.tools \ + --hidden-import core.tools.memory_tools \ + --hidden-import core.prompts \ + --hidden-import core.prompts.prompt_manager \ + --hidden-import ui \ + --hidden-import ui.app \ + --hidden-import ui.models \ + --hidden-import ui.models.message \ + --hidden-import ui.models.config \ + --hidden-import ui.models.log_entry \ + --hidden-import ui.widgets \ + --hidden-import ui.handlers \ + --hidden-import ui.services \ + --hidden-import ui.services.config_manager \ + --hidden-import ui.services.config_service \ + --collect-all textual \ + --noconfirm + +echo "===== Build Complete =====" +echo "Binary: dist/TrulyMEM" +ls -la dist/ + +# 清理虚拟环境 +echo "Cleaning up virtual environment..." +deactivate +rm -rf "$VENV_DIR" + +echo "Build finished successfully!" \ No newline at end of file diff --git a/build/build_macos.sh b/build/build_macos.sh new file mode 100644 index 0000000..69afd97 --- /dev/null +++ b/build/build_macos.sh @@ -0,0 +1,90 @@ +#!/bin/bash +set -e + +echo "===== Building TrulyMEM for macOS =====" + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" +cd "$PROJECT_ROOT" + +echo "Project root: $PROJECT_ROOT" + +if ! command -v python3 &> /dev/null; then + echo "Error: python3 not found" + exit 1 +fi + +# 创建并激活虚拟环境 +VENV_DIR="$PROJECT_ROOT/.venv_build" + +echo "Creating virtual environment: $VENV_DIR" +python3 -m venv "$VENV_DIR" + +echo "Activating virtual environment..." +source "$VENV_DIR/bin/activate" + +echo "Upgrading pip in virtual environment..." +pip install --upgrade pip + +echo "Installing dependencies in virtual environment..." +pip install -r requirements.txt + +echo "Generating ICNS icon..." +if [ -d "pic/TrulyMEM.iconset" ]; then + iconutil -c icns pic/TrulyMEM.iconset -o pic/TrulyMEM.icns + echo "ICNS icon generated: pic/TrulyMEM.icns" +fi + +echo "Cleaning previous builds..." +rm -rf build/dist build/__pycache__ 2>/dev/null || true + +echo "Running PyInstaller..." +python -m PyInstaller trulymem_entry.py \ + --clean \ + --onefile \ + --console \ + --name TrulyMEM \ + --icon "pic/TrulyMEM.icns" \ + --add-data "ui/styles:ui/styles" \ + --add-data "core/prompts/templates:core/prompts/templates" \ + --hidden-import textual \ + --hidden-import textual.app \ + --hidden-import textual.widgets \ + --hidden-import textual.css \ + --hidden-import openai \ + --hidden-import openai._client \ + --hidden-import neo4j \ + --hidden-import sqlite3 \ + --hidden-import core \ + --hidden-import core.embedded_db \ + --hidden-import core.graph_client \ + --hidden-import core.tool_executor \ + --hidden-import core.tool_limiter \ + --hidden-import core.tools \ + --hidden-import core.tools.memory_tools \ + --hidden-import core.prompts \ + --hidden-import core.prompts.prompt_manager \ + --hidden-import ui \ + --hidden-import ui.app \ + --hidden-import ui.models \ + --hidden-import ui.models.message \ + --hidden-import ui.models.config \ + --hidden-import ui.models.log_entry \ + --hidden-import ui.widgets \ + --hidden-import ui.handlers \ + --hidden-import ui.services \ + --hidden-import ui.services.config_manager \ + --hidden-import ui.services.config_service \ + --collect-all textual \ + --noconfirm + +echo "===== Build Complete =====" +echo "Binary: dist/TrulyMEM" +ls -la dist/ + +# 清理虚拟环境 +echo "Cleaning up virtual environment..." +deactivate +rm -rf "$VENV_DIR" + +echo "Build finished successfully!" \ No newline at end of file diff --git a/build/build_windows.bat b/build/build_windows.bat new file mode 100644 index 0000000..bc49619 --- /dev/null +++ b/build/build_windows.bat @@ -0,0 +1,60 @@ +@echo off +echo ===== Building TrulyMEM for Windows ===== + +REM 切换到脚本所在目录的上一级目录(项目根目录) +cd /d "%~dp0.." +echo Project root: %CD% + +python --version >nul 2>&1 +if errorlevel 1 ( + echo Error: python not found + exit /b 1 +) + +echo Installing dependencies... +pip install -r requirements.txt + +echo Running PyInstaller... +python -m PyInstaller trulymem_entry.py ^ + --clean ^ + --onefile ^ + --console ^ + --name TrulyMEM ^ + --icon "pic/TrulyMEM.ico" ^ + --add-data "ui/styles;ui/styles" ^ + --add-data "core/prompts/templates;core/prompts/templates" ^ + --hidden-import textual ^ + --hidden-import textual.app ^ + --hidden-import textual.widgets ^ + --hidden-import textual.css ^ + --hidden-import openai ^ + --hidden-import openai._client ^ + --hidden-import neo4j ^ + --hidden-import sqlite3 ^ + --hidden-import core ^ + --hidden-import core.embedded_db ^ + --hidden-import core.graph_client ^ + --hidden-import core.tool_executor ^ + --hidden-import core.tool_limiter ^ + --hidden-import core.tools ^ + --hidden-import core.tools.memory_tools ^ + --hidden-import core.prompts ^ + --hidden-import core.prompts.prompt_manager ^ + --hidden-import ui ^ + --hidden-import ui.app ^ + --hidden-import ui.models ^ + --hidden-import ui.models.message ^ + --hidden-import ui.models.config ^ + --hidden-import ui.models.log_entry ^ + --hidden-import ui.widgets ^ + --hidden-import ui.handlers ^ + --hidden-import ui.services ^ + --hidden-import ui.services.config_manager ^ + --hidden-import ui.services.config_service ^ + --collect-all textual ^ + --noconfirm + +echo ===== Build Complete ===== +echo Binary: dist\TrulyMEM.exe +dir dist\TrulyMEM.exe +pause \ No newline at end of file diff --git a/build/trulymem.spec b/build/trulymem.spec new file mode 100644 index 0000000..810ca53 --- /dev/null +++ b/build/trulymem.spec @@ -0,0 +1,92 @@ +# -*- mode: python ; coding: utf-8 -*- +import os +import sys + +block_cipher = None + +project_root = os.path.dirname(os.path.abspath(SPEC)) +sys.path.insert(0, project_root) + +datas = [] +if os.path.exists(os.path.join(project_root, 'ui', 'styles')): + for root, dirs, files in os.walk(os.path.join(project_root, 'ui', 'styles')): + for f in files: + src = os.path.join(root, f) + dst = os.path.join('ui', 'styles', os.path.relpath(src, os.path.join(project_root, 'ui', 'styles'))) + datas.append((src, dst)) + +if os.path.exists(os.path.join(project_root, 'core', 'prompts', 'templates')): + for root, dirs, files in os.walk(os.path.join(project_root, 'core', 'prompts', 'templates')): + for f in files: + src = os.path.join(root, f) + dst = os.path.join('core', 'prompts', 'templates', os.path.relpath(src, os.path.join(project_root, 'core', 'prompts', 'templates'))) + datas.append((src, dst)) + +a = Analysis( + ['trulymem_entry.py'], + pathex=[], + binaries=[], + datas=datas, + hiddenimports=[ + 'textual', + 'textual.app', + 'textual.widgets', + 'textual.css', + 'openai', + 'openai._client', + 'neo4j', + 'sqlite3', + 'graph_memory_tui', + 'core', + 'core.embedded_db', + 'core.graph_client', + 'core.tool_executor', + 'core.tool_limiter', + 'core.tools', + 'core.tools.memory_tools', + 'core.prompts', + 'core.prompts.prompt_manager', + 'ui', + 'ui.app', + 'ui.models', + 'ui.models.message', + 'ui.models.config', + 'ui.models.log_entry', + 'ui.widgets', + 'ui.widgets.left_panel', + 'ui.widgets.right_panel', + 'ui.widgets.input_box', + 'ui.widgets.message_history', + 'ui.widgets.status_bar', + 'ui.handlers', + 'ui.services', + 'ui.services.config_manager', + ], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + noarchive=False, + optimize=0, +) +pyz = PYZ(a.pure, block_cipher) +exe = EXE( + pyz, + a.scripts, + a.binaries, + a.datas, + [], + name='TrulyMEM', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + upx_exclude=[], + runtime_tmpdir=None, + console=True, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, +) \ No newline at end of file