mirror of
https://gitcode.com/JianFeeeee/TrulyMEM-TrueHumanMEM.git
synced 2026-10-15 12:15:32 +00:00
feat: 日志持久化(6h归档) + purge增强(source_type/source_has_status过滤)
- ActivityRecorder 新增 LogPersister 后台线程,每10s增量写入logs/operations.*.log - 日志每6小时自动gzip压缩归档 - memory_purge 新增 source_type / target_type / source_has_status 过滤条件 - 支持精准清理已归档任务的残留 HAS_STATE 关系
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
set -euo pipefail
|
||||
|
||||
echo "===== Building TrulyMEM AppImage ====="
|
||||
|
||||
@ -11,39 +11,65 @@ echo "Project root: $PROJECT_ROOT"
|
||||
APP_NAME="TrulyMEM"
|
||||
APP_DIR="$PROJECT_ROOT/build/appimage-build"
|
||||
|
||||
echo "Cleaning..."
|
||||
rm -rf "$APP_DIR" dist/ build/trulymem/ 2>/dev/null || true
|
||||
# ── Step 1: 复用 build_linux.sh 完成 PyInstaller 构建 ──
|
||||
echo ""
|
||||
echo "Step 1: Running build_linux.sh (PyInstaller build)..."
|
||||
bash "$SCRIPT_DIR/build_linux.sh"
|
||||
|
||||
# Step 1: Build with PyInstaller (uses icon from .spec)
|
||||
echo "Step 1: PyInstaller build..."
|
||||
python3 -m PyInstaller --clean build/trulymem.spec --noconfirm
|
||||
# ── Step 2: 检查 dist/ 中是否有二进制 ──
|
||||
echo ""
|
||||
echo "Step 2: Checking PyInstaller output..."
|
||||
if [ ! -f "dist/$APP_NAME" ]; then
|
||||
echo "Error: dist/$APP_NAME not found after build_linux.sh"; exit 1
|
||||
fi
|
||||
echo "✅ Found dist/$APP_NAME ($(ls -lh "dist/$APP_NAME" | awk '{print $5}'))"
|
||||
|
||||
# Step 2: Prepare AppDir structure
|
||||
echo "Step 2: Preparing AppDir..."
|
||||
# ── Step 3: 组织 AppDir 结构 ──
|
||||
echo ""
|
||||
echo "Step 3: Preparing AppDir structure..."
|
||||
rm -rf "$APP_DIR" 2>/dev/null || true
|
||||
mkdir -p "$APP_DIR/usr/bin"
|
||||
mkdir -p "$APP_DIR/usr/share/applications"
|
||||
mkdir -p "$APP_DIR/usr/share/icons/hicolor/256x256/apps"
|
||||
mkdir -p "$APP_DIR/usr/share/icons/hicolor/48x48/apps"
|
||||
|
||||
cp "dist/$APP_NAME" "$APP_DIR/usr/bin/"
|
||||
|
||||
# 图标处理
|
||||
ICON_SOURCE=""
|
||||
if [ -f "pic/image.png" ]; then
|
||||
cp "pic/image.png" "$APP_DIR/usr/share/icons/hicolor/256x256/apps/${APP_NAME}.png"
|
||||
cp "pic/image.png" "$APP_DIR/${APP_NAME}.png"
|
||||
else
|
||||
echo -n "" > "$APP_DIR/${APP_NAME}.png"
|
||||
ICON_SOURCE="pic/image.png"
|
||||
elif [ -f "pic/TrulyMEM.ico" ]; then
|
||||
echo "⚠️ No pic/image.png found; .ico will not display as AppImage icon"
|
||||
echo " To generate a PNG: convert pic/TrulyMEM.ico pic/image.png"
|
||||
fi
|
||||
|
||||
if [ -n "$ICON_SOURCE" ]; then
|
||||
cp "$ICON_SOURCE" "$APP_DIR/usr/share/icons/hicolor/256x256/apps/${APP_NAME}.png"
|
||||
cp "$ICON_SOURCE" "$APP_DIR/usr/share/icons/hicolor/48x48/apps/${APP_NAME}.png"
|
||||
cp "$ICON_SOURCE" "$APP_DIR/${APP_NAME}.png"
|
||||
echo "✅ Icon: $ICON_SOURCE"
|
||||
else
|
||||
echo "⚠️ No icon found, creating placeholder"
|
||||
touch "$APP_DIR/${APP_NAME}.png"
|
||||
fi
|
||||
|
||||
# .desktop 文件
|
||||
cat > "$APP_DIR/${APP_NAME}.desktop" <<EOF
|
||||
[Desktop Entry]
|
||||
Name=${APP_NAME}
|
||||
Comment=True Human Memory - TUI & Web Mode
|
||||
Exec=${APP_NAME}
|
||||
Icon=${APP_NAME}
|
||||
Type=Application
|
||||
Categories=Utility;
|
||||
Categories=Utility;Office;
|
||||
Terminal=true
|
||||
StartupNotify=true
|
||||
EOF
|
||||
|
||||
cp "$APP_DIR/${APP_NAME}.desktop" "$APP_DIR/usr/share/applications/"
|
||||
|
||||
# AppRun 入口
|
||||
cat > "$APP_DIR/AppRun" <<'APPRUN'
|
||||
#!/bin/bash
|
||||
HERE="$(dirname "$(readlink -f "$0")")"
|
||||
@ -51,15 +77,24 @@ exec "$HERE/usr/bin/TrulyMEM" "$@"
|
||||
APPRUN
|
||||
chmod +x "$APP_DIR/AppRun"
|
||||
|
||||
# Step 3: Build AppImage (requires appimagetool)
|
||||
echo "Step 3: Building AppImage..."
|
||||
# ── Step 4: 打包 AppImage ──
|
||||
echo ""
|
||||
echo "Step 4: Building AppImage..."
|
||||
if command -v appimagetool &> /dev/null; then
|
||||
appimagetool "$APP_DIR" "dist/${APP_NAME}.AppImage"
|
||||
echo "AppImage: dist/${APP_NAME}.AppImage"
|
||||
ls -la "dist/${APP_NAME}.AppImage"
|
||||
ARCH="${ARCH:-$(uname -m)}" appimagetool "$APP_DIR" "dist/${APP_NAME}.AppImage"
|
||||
echo "✅ AppImage: dist/${APP_NAME}.AppImage"
|
||||
ls -lh "dist/${APP_NAME}.AppImage"
|
||||
else
|
||||
echo "appimagetool not found. AppDir ready at: $APP_DIR"
|
||||
echo "Install appimagetool and run: appimagetool '$APP_DIR' 'dist/${APP_NAME}.AppImage'"
|
||||
echo "⚠️ appimagetool not found. AppDir ready at: $APP_DIR"
|
||||
echo ""
|
||||
echo "To complete manually, install appimagetool:"
|
||||
echo " wget https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-$(uname -m).AppImage"
|
||||
echo " chmod +x appimagetool-*.AppImage"
|
||||
echo " ./appimagetool-*.AppImage '$APP_DIR' 'dist/${APP_NAME}.AppImage'"
|
||||
echo ""
|
||||
echo "AppDir contents:"
|
||||
find "$APP_DIR" -type f | head -20
|
||||
fi
|
||||
|
||||
echo "===== AppImage Build Complete ====="
|
||||
echo ""
|
||||
echo "===== AppImage Build Complete ====="
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
set -euo pipefail
|
||||
|
||||
echo "===== Building TrulyMEM for Linux ====="
|
||||
|
||||
@ -8,47 +8,102 @@ 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
|
||||
|
||||
if [ ! -f requirements.txt ]; then
|
||||
echo "Error: requirements.txt not found in $PROJECT_ROOT"; exit 1
|
||||
fi
|
||||
|
||||
# ── 检测 python3-venv ──
|
||||
VENV_AVAILABLE=false
|
||||
if python3 -c "import ensurepip" 2>/dev/null && python3 -m venv --help &>/dev/null; then
|
||||
VENV_AVAILABLE=true
|
||||
else
|
||||
echo "⚠️ python3-venv 未安装(或缺少 ensurepip),建议安装以获得干净构建环境:"
|
||||
echo " sudo apt install python3-venv # Debian/Ubuntu"
|
||||
echo " sudo dnf install python3-virtualenv # Fedora"
|
||||
echo "将使用系统 Python 环境继续(依赖全局包)..."
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# ── 尝试 venv 隔离构建,失败则用系统环境 ──
|
||||
USE_VENV=false
|
||||
if python3 -m venv --help &>/dev/null; then
|
||||
if [ "$VENV_AVAILABLE" = true ]; then
|
||||
VENV_DIR="$PROJECT_ROOT/.venv_build"
|
||||
echo "Creating virtual environment..."
|
||||
if python3 -m venv "$VENV_DIR" 2>/dev/null; then
|
||||
source "$VENV_DIR/bin/activate"
|
||||
USE_VENV=true
|
||||
echo "Using virtual environment"
|
||||
echo "✅ Using virtual environment: $VENV_DIR"
|
||||
pip install --upgrade pip -q
|
||||
pip install -r requirements.txt -q
|
||||
else
|
||||
echo "Warning: venv creation failed, falling back to system Python"
|
||||
echo "⚠️ venv creation failed, falling back to system Python"
|
||||
fi
|
||||
else
|
||||
echo "Warning: python3-venv not available, falling back to system Python"
|
||||
fi
|
||||
|
||||
if [ "$USE_VENV" = false ]; then
|
||||
echo "Installing dependencies (system Python)..."
|
||||
pip install -r requirements.txt --break-system-packages -q 2>/dev/null || \
|
||||
pip install -r requirements.txt -q 2>/dev/null || true
|
||||
pip install -r requirements.txt -q 2>/dev/null || {
|
||||
echo "⚠️ pip install failed, trying pip3..."
|
||||
pip3 install -r requirements.txt --break-system-packages -q 2>/dev/null || \
|
||||
pip3 install -r requirements.txt -q 2>/dev/null || \
|
||||
echo "⚠️ Some dependencies may be missing; build will proceed anyway"
|
||||
}
|
||||
fi
|
||||
|
||||
# ── 清理旧构建 ──
|
||||
echo ""
|
||||
echo "Cleaning previous builds..."
|
||||
rm -rf dist/ build/trulymem/ 2>/dev/null || true
|
||||
|
||||
# ── PyInstaller 构建 ──
|
||||
echo ""
|
||||
echo "================================"
|
||||
echo "Building TrulyMEM (TUI + Web embedded)"
|
||||
echo "================================"
|
||||
python3 -m PyInstaller --clean build/trulymem.spec --noconfirm
|
||||
|
||||
# ── 创建 Linux `.desktop` 文件(打包图标不能嵌入 ELF,通过 .desktop 引用)──
|
||||
echo ""
|
||||
echo "Generating .desktop file for Linux..."
|
||||
BINARY_PATH="$(cd dist && pwd)/TrulyMEM"
|
||||
ICON_PATH="$(cd pic && pwd)/image.png"
|
||||
|
||||
cat > "dist/TrulyMEM.desktop" <<EOF
|
||||
[Desktop Entry]
|
||||
Name=TrulyMEM
|
||||
Comment=True Human Memory - TUI & Web Mode
|
||||
Exec=${BINARY_PATH}
|
||||
Icon=${ICON_PATH}
|
||||
Terminal=true
|
||||
Type=Application
|
||||
Categories=Utility;Office;
|
||||
StartupNotify=true
|
||||
EOF
|
||||
|
||||
chmod +x "dist/TrulyMEM.desktop"
|
||||
echo "✅ dist/TrulyMEM.desktop created (icon: pic/image.png)"
|
||||
|
||||
# ── 构建完成 ──
|
||||
echo ""
|
||||
echo "================================"
|
||||
echo "===== Build Complete ====="
|
||||
echo "Binary: dist/TrulyMEM"
|
||||
ls -la dist/
|
||||
echo "Binary: dist/TrulyMEM"
|
||||
echo "Desktop: dist/TrulyMEM.desktop"
|
||||
echo "------------------------------"
|
||||
ls -lh dist/ 2>/dev/null || ls -la dist/
|
||||
echo "================================"
|
||||
|
||||
# ── 清理 venv ──
|
||||
if [ "$USE_VENV" = true ]; then
|
||||
deactivate 2>/dev/null || true
|
||||
rm -rf "$VENV_DIR"
|
||||
echo "Virtual environment cleaned up."
|
||||
fi
|
||||
echo "Build finished successfully!"
|
||||
|
||||
echo "Build finished successfully!"
|
||||
|
||||
Reference in New Issue
Block a user