| @echo off | |
| chcp 65001 >nul | |
| setlocal EnableExtensions EnableDelayedExpansion | |
| goto :main | |
| :fail | |
| set "EXIT_CODE=%~1" | |
| if not defined EXIT_CODE set "EXIT_CODE=1" | |
| echo. | |
| echo [ERROR] Build failed. | |
| echo Please check build.log in the project root. | |
| echo. | |
| if exist "%BUILD_LOG%" ( | |
| echo Last log lines: | |
| echo ------------------------------------------------------------ | |
| powershell -NoProfile -ExecutionPolicy Bypass -Command "if (Test-Path '%BUILD_LOG%') { Get-Content '%BUILD_LOG%' -Tail 80 }" | |
| echo ------------------------------------------------------------ | |
| ) | |
| echo. | |
| pause | |
| exit /b %EXIT_CODE% | |
| :main | |
| cd /d "%~dp0" || goto fail | |
| set "BUILD_LOG=%~dp0build.log" | |
| >"%BUILD_LOG%" ( | |
| echo LandPPT build started at %date% %time% | |
| echo Workdir: %cd% | |
| echo ================================================ | |
| ) | |
| echo LandPPT build script started. | |
| echo Current directory: %cd% | |
| echo Log file: %BUILD_LOG% | |
| echo. | |
| set "PYTHON_CMD=" | |
| if exist ".venv\Scripts\python.exe" set "PYTHON_CMD=.venv\Scripts\python.exe" | |
| if not defined PYTHON_CMD where python >nul 2>nul && set "PYTHON_CMD=python" | |
| if not defined PYTHON_CMD ( | |
| echo [ERROR] Python not found. | |
| >>"%BUILD_LOG%" echo [ERROR] Python not found. | |
| goto fail | |
| ) | |
| echo Checking Python... | |
| "%PYTHON_CMD%" --version >> "%BUILD_LOG%" 2>&1 | |
| if errorlevel 1 goto fail | |
| echo Checking pip... | |
| "%PYTHON_CMD%" -m pip --version >> "%BUILD_LOG%" 2>&1 | |
| if errorlevel 1 ( | |
| echo pip not found, bootstrapping pip... | |
| "!PYTHON_CMD!" -m ensurepip --upgrade >> "%BUILD_LOG%" 2>&1 | |
| if errorlevel 1 ( | |
| powershell -NoProfile -ExecutionPolicy Bypass -Command "Invoke-WebRequest -UseBasicParsing https://bootstrap.pypa.io/get-pip.py -OutFile get-pip.py" >> "%BUILD_LOG%" 2>&1 | |
| if errorlevel 1 goto fail | |
| "!PYTHON_CMD!" get-pip.py >> "%BUILD_LOG%" 2>&1 | |
| if errorlevel 1 goto fail | |
| del /q get-pip.py >nul 2>&1 | |
| ) | |
| ) | |
| echo Installing/checking runtime dependencies from pyproject.toml... | |
| >>"%BUILD_LOG%" echo Installing/checking runtime dependencies from pyproject.toml... | |
| "%PYTHON_CMD%" -m pip install --upgrade pip setuptools wheel >> "%BUILD_LOG%" 2>&1 | |
| if errorlevel 1 goto fail | |
| "%PYTHON_CMD%" -m pip install -e . >> "%BUILD_LOG%" 2>&1 | |
| if errorlevel 1 goto fail | |
| "%PYTHON_CMD%" -m pip install pyinstaller aiosqlite >> "%BUILD_LOG%" 2>&1 | |
| if errorlevel 1 goto fail | |
| echo Running preflight import checks... | |
| >>"%BUILD_LOG%" echo Running preflight import checks... | |
| "%PYTHON_CMD%" -c "import fastapi,uvicorn,jinja2,sqlalchemy,aiosqlite,sqlite3,httpx,aiofiles,PIL,requests,dotenv,bs4,markdown,docx,PyPDF2,passlib,jose,pydantic_settings,openai,anthropic,tiktoken,aiohttp,rich,chardet,pandas; import landppt.main; print('preflight ok')" >> "%BUILD_LOG%" 2>&1 | |
| if errorlevel 1 goto fail | |
| set "ICON_ARG=--icon=NONE" | |
| if exist "src\landppt\web\static\images\landppt-logo.ico" set "ICON_ARG=--icon=src\landppt\web\static\images\landppt-logo.ico" | |
| if not exist "src\landppt\web\static\images\landppt-logo.ico" if exist "src\landppt\web\static\images\favicon.ico" set "ICON_ARG=--icon=src\landppt\web\static\images\favicon.ico" | |
| if "%ICON_ARG%"=="--icon=NONE" if exist "logo_256x256.ico" set "ICON_ARG=--icon=logo_256x256.ico" | |
| echo Cleaning old build files... | |
| if exist build rmdir /s /q build | |
| if exist dist rmdir /s /q dist | |
| echo Running PyInstaller. This may take several minutes... | |
| >>"%BUILD_LOG%" echo Running PyInstaller... | |
| "%PYTHON_CMD%" -m PyInstaller ^ | |
| --noconfirm ^ | |
| --clean ^ | |
| --onedir ^ | |
| --name LandPPT ^ | |
| --paths "src" ^ | |
| %ICON_ARG% ^ | |
| --add-data="src\landppt\web\templates:src\landppt\web\templates" ^ | |
| --add-data="src\landppt\web\static:src\landppt\web\static" ^ | |
| --add-data="API 配置:API 配置" ^ | |
| --collect-submodules aiosqlite ^ | |
| --collect-submodules sqlalchemy.dialects.sqlite ^ | |
| --collect-submodules uvicorn ^ | |
| --collect-submodules fastapi ^ | |
| --collect-submodules starlette ^ | |
| --collect-submodules pydantic ^ | |
| --collect-submodules pydantic_settings ^ | |
| --collect-submodules passlib ^ | |
| --collect-submodules jose ^ | |
| --collect-submodules openai ^ | |
| --collect-submodules anthropic ^ | |
| --collect-submodules google.generativeai ^ | |
| --collect-submodules PIL ^ | |
| --collect-data fastapi ^ | |
| --collect-data starlette ^ | |
| --collect-data pydantic ^ | |
| --copy-metadata aiosqlite ^ | |
| --copy-metadata sqlalchemy ^ | |
| --copy-metadata fastapi ^ | |
| --copy-metadata starlette ^ | |
| --copy-metadata uvicorn ^ | |
| --copy-metadata pydantic ^ | |
| --copy-metadata pydantic-settings ^ | |
| --copy-metadata python-dotenv ^ | |
| --hidden-import landppt.main ^ | |
| --hidden-import aiosqlite ^ | |
| --hidden-import sqlite3 ^ | |
| --hidden-import sqlalchemy.dialects.sqlite.aiosqlite ^ | |
| --hidden-import dotenv ^ | |
| --hidden-import multipart ^ | |
| --hidden-import email_validator ^ | |
| --hidden-import bs4 ^ | |
| --hidden-import markdown ^ | |
| --hidden-import docx ^ | |
| --hidden-import PyPDF2 ^ | |
| --hidden-import passlib.handlers.bcrypt ^ | |
| --hidden-import jose ^ | |
| --hidden-import pydantic_settings ^ | |
| --hidden-import openai ^ | |
| --hidden-import anthropic ^ | |
| --hidden-import tiktoken ^ | |
| --hidden-import aiohttp ^ | |
| --hidden-import rich ^ | |
| --hidden-import chardet ^ | |
| --hidden-import pandas ^ | |
| run.py >> "%BUILD_LOG%" 2>&1 | |
| if errorlevel 1 goto fail | |
| if exist "dist\LandPPT" ( | |
| if not exist "dist\LandPPT\temp" mkdir "dist\LandPPT\temp" | |
| >"dist\LandPPT\run_exe_debug.bat" echo @echo off | |
| >>"dist\LandPPT\run_exe_debug.bat" echo chcp 65001 ^>nul | |
| >>"dist\LandPPT\run_exe_debug.bat" echo cd /d "%%~dp0" | |
| >>"dist\LandPPT\run_exe_debug.bat" echo echo Starting LandPPT.exe in debug mode... | |
| >>"dist\LandPPT\run_exe_debug.bat" echo echo. | |
| >>"dist\LandPPT\run_exe_debug.bat" echo LandPPT.exe | |
| >>"dist\LandPPT\run_exe_debug.bat" echo echo. | |
| >>"dist\LandPPT\run_exe_debug.bat" echo echo LandPPT.exe exited with code %%ERRORLEVEL%% | |
| >>"dist\LandPPT\run_exe_debug.bat" echo if exist landppt_startup_error.log ^( | |
| >>"dist\LandPPT\run_exe_debug.bat" echo echo. | |
| >>"dist\LandPPT\run_exe_debug.bat" echo echo Last startup error log: | |
| >>"dist\LandPPT\run_exe_debug.bat" echo echo ------------------------------------------------------------ | |
| >>"dist\LandPPT\run_exe_debug.bat" echo powershell -NoProfile -ExecutionPolicy Bypass -Command "Get-Content 'landppt_startup_error.log' -Tail 120" | |
| >>"dist\LandPPT\run_exe_debug.bat" echo echo ------------------------------------------------------------ | |
| >>"dist\LandPPT\run_exe_debug.bat" echo ^) | |
| >>"dist\LandPPT\run_exe_debug.bat" echo pause | |
| ) | |
| echo. | |
| echo [OK] Build finished successfully. | |
| echo Output: dist\LandPPT\LandPPT.exe | |
| echo Debug launcher: dist\LandPPT\run_exe_debug.bat | |
| >>"%BUILD_LOG%" echo [OK] Build finished successfully. | |
| >>"%BUILD_LOG%" echo Output: dist\LandPPT\LandPPT.exe | |
| echo. | |
| pause | |
| exit /b 0 | |