fix: complete build scripts with all required hidden imports

- Add all core and ui module hidden imports
- Add textual and its submodules
- Add openai and neo4j dependencies
- Update trulymem.spec with dynamic data collection
- Add all platform build scripts (Linux/Windows/macOS)
This commit is contained in:
root
2026-04-12 21:06:59 +08:00
parent 178c45c410
commit efc8182aa2
2 changed files with 99 additions and 14 deletions

View File

@ -1,22 +1,58 @@
#!/bin/bash
set -e
echo "Building Linux binary..."
echo "===== Building TrulyMEM for Linux ====="
if ! command -v python3 &> /dev/null; then
echo "Error: python3 not found"
exit 1
fi
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
cd "$PROJECT_ROOT"
pip3 install -r requirements.txt
echo "Project root: $PROJECT_ROOT"
python3 -m PyInstaller --clean --onefile --console \
echo "Installing dependencies..."
pip3 install -r requirements.txt 2>/dev/null || pip install -r requirements.txt
echo "Cleaning previous builds..."
rm -rf build/dist build/__pycache__ 2>/dev/null || true
echo "Running PyInstaller..."
python3 -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 \
--collect-all textual \
trulymem_entry.py
--noconfirm
echo "Done! Binary: dist/TrulyMEM"
echo "===== Build Complete ====="
echo "Binary: dist/TrulyMEM"
ls -la dist/

View File

@ -1,17 +1,66 @@
# -*- 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=[
('ui/styles', 'ui/styles'),
('core/prompts/templates', 'core/prompts/templates'),
],
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={},
@ -20,7 +69,7 @@ a = Analysis(
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
pyz = PYZ(a.pure, block_cipher)
exe = EXE(
pyz,
a.scripts,