فهرست منبع

优化: 打包后生成service_install.bat, 执行后部署为windows服务

longjoedyy 1 ماه پیش
والد
کامیت
54f089a631
3فایلهای تغییر یافته به همراه208 افزوده شده و 1 حذف شده
  1. 207 1
      cythonize.py
  2. BIN
      nssm.exe
  3. 1 0
      setup.py

+ 207 - 1
cythonize.py

@@ -186,6 +186,10 @@ def create_deployment():
     # 创建启动脚本
     create_start_scripts(deploy_dir)
 
+    # 创建 Windows 服务脚本(新增)
+    if sys.platform == "win32":
+        create_windows_service_scripts(deploy_dir)
+
     print(f"✅ 部署包: {deploy_dir}")
 
 
@@ -240,6 +244,208 @@ python3 app.py
     print("  创建启动脚本: start.bat, start.sh")
 
 
+def create_windows_service_scripts(deploy_dir):
+    """创建 Windows 服务管理脚本"""
+    print("  创建 Windows 服务脚本...")
+
+    # 检查本地 nssm.exe
+    nssm_exe = Path("nssm.exe")
+    if not nssm_exe.exists():
+        print("  ⚠️  未找到 nssm.exe,跳过服务脚本创建")
+        return
+
+    # 复制 nssm.exe 到部署目录
+    nssm_dst = deploy_dir / "nssm.exe"
+    shutil.copy2(nssm_exe, nssm_dst)
+    print("  ✅ 复制 nssm.exe")
+
+    # 服务安装脚本
+    install_bat = """@echo off
+chcp 65001 >nul
+echo ========================================
+echo      LongjoeAgent Windows Service Install
+echo ========================================
+echo.
+
+REM 检查是否以管理员权限运行
+net session >nul 2>&1
+if %errorlevel% neq 0 (
+    echo Error: 请以管理员权限运行此脚本!
+    echo 请右键点击此脚本 -> "以管理员身份运行"
+    pause
+    exit /b 1
+)
+
+REM 动态获取脚本所在目录
+set "PROJECT_DIR=%~dp0"
+set "PROJECT_DIR=%PROJECT_DIR:~0,-1%"
+
+echo 项目目录: %PROJECT_DIR%
+
+REM 检查必要文件是否存在
+if not exist "%PROJECT_DIR%\\nssm.exe" (
+    echo 错误: nssm.exe 未在项目目录中找到!
+    pause
+    exit /b 1
+)
+
+if not exist "%PROJECT_DIR%\\app.py" (
+    echo 错误: app.py 未在项目目录中找到!
+    pause
+    exit /b 1
+)
+
+REM 动态查找Python安装路径
+echo 搜索Python安装...
+for /f "delims=" %%i in ('where python') do (
+    set "PYTHON_PATH=%%i"
+    goto :found_python
+)
+
+:found_python
+if not defined PYTHON_PATH (
+    echo 错误: 未找到Python!
+    echo 请安装 Python 3.7+ 并确保其在 PATH 中
+    pause
+    exit /b 1
+)
+
+echo 找到Python: %PYTHON_PATH%
+
+REM 停止并移除现有服务
+echo Unstall Service
+net stop LongjoeAI >nul 2>&1
+timeout /t 2 /nobreak >nul
+"%PROJECT_DIR%\\nssm.exe" remove LongjoeAI confirm >nul 2>&1
+
+REM 关键修正:使用正确的引号格式(模仿您的成功命令)
+echo 安装 LongjoeAI 服务...
+"%PROJECT_DIR%\\nssm.exe" install LongjoeAI "cmd" "/c cd /d "%PROJECT_DIR%" && "%PYTHON_PATH%" app.py"
+
+if errorlevel 1 (
+    echo 错误: 服务安装失败!
+    echo.
+    echo 调试信息:
+    echo 项目目录: %PROJECT_DIR%
+    echo Python 路径: %PYTHON_PATH%
+)
+
+REM 配置服务参数
+echo 配置服务参数...
+"%PROJECT_DIR%\\nssm.exe" set LongjoeAI DisplayName "Longjoe AI Agent Service"
+"%PROJECT_DIR%\\nssm.exe" set LongjoeAI Description "龙嘉软件AI助手服务"
+
+echo.
+echo LongjoeAI 服务安装完成!
+goto :start_service
+
+:start_service
+echo.
+echo Starting service...
+net start LongjoeAI
+
+if %errorlevel% equ 0 (
+    echo SUCCESS: Service started successfully!
+    echo.
+    
+) else (
+    echo ERROR: Service failed to start
+    echo.
+)
+
+echo.
+pause
+"""
+
+    # 服务卸载脚本
+    uninstall_bat = """@echo off
+chcp 65001 >nul
+echo ========================================
+echo      LongjoeAI Service Uninstall
+echo ========================================
+echo.
+
+REM 检查是否以管理员权限运行
+net session >nul 2>&1
+if %errorlevel% neq 0 (
+    echo 错误: 请以管理员权限运行此脚本!
+    echo 请右键点击此脚本 -> "以管理员身份运行"
+    pause
+    exit /b 1
+)
+
+REM 动态获取项目目录
+set "PROJECT_DIR=%~dp0"
+set "PROJECT_DIR=%PROJECT_DIR:~0,-1%"
+
+echo 停止服务...
+net stop LongjoeAI >nul 2>&1
+timeout /t 3 /nobreak >nul
+
+echo 卸载服务...
+"%PROJECT_DIR%\\nssm.exe" remove LongjoeAI confirm >nul 2>&1
+
+if errorlevel 1 (
+    echo 尝试强制删除...
+    sc delete LongjoeAI >nul 2>&1
+)
+
+echo LongjoeAI 服务卸载成功!
+echo.
+pause
+"""
+
+    # 服务管理脚本
+    manage_bat = """@echo off
+chcp 65001 >nul
+echo ========================================
+echo      LongjoeAI Service Management
+echo ========================================
+echo.
+
+set "PROJECT_DIR=%~dp0"
+set "PROJECT_DIR=%PROJECT_DIR:~0,-1%"
+
+echo 1. 启动服务
+echo 2. 停止服务
+echo 3. 重启服务
+echo 4. 服务状态
+echo 5. Exit
+echo.
+set /p choice=请选择操作 (1-5): 
+
+if "%choice%"=="1" (
+    net start LongjoeAI
+    if %errorlevel% equ 0 echo Service started successfully.
+) else if "%choice%"=="2" (
+    net stop LongjoeAI
+    if %errorlevel% equ 0 echo Service stopped successfully.
+) else if "%choice%"=="3" (
+    net stop LongjoeAI
+    timeout /t 2 /nobreak >nul
+    net start LongjoeAI
+    if %errorlevel% equ 0 echo Service restarted successfully.
+) else if "%choice%"=="4" (
+    sc query LongjoeAI
+) else if "%choice%"=="5" (
+    exit
+) else (
+    echo 错误: 无效选择!
+)
+
+echo.
+pause
+"""
+
+    # 写入脚本文件
+    (deploy_dir / "service_install.bat").write_text(install_bat, encoding="utf-8")
+    (deploy_dir / "service_uninstall.bat").write_text(uninstall_bat, encoding="utf-8")
+    (deploy_dir / "service_manage.bat").write_text(manage_bat, encoding="utf-8")
+    print(
+        "  ✅ 创建服务脚本: service_install.bat, service_uninstall.bat, service_manage.bat"
+    )
+
+
 def main():
     """主函数"""
     print_banner()
@@ -271,7 +477,7 @@ def main():
     print("\n🚀 使用方法:")
     print("  开发: python app.py")
     print("  部署: 复制 build/deploy/ 到服务器")
-    print("  运行: 执行 start.sh 或 start.bat")
+    print("  运行: 执行 service_install.bat")
 
 
 if __name__ == "__main__":

BIN
nssm.exe


+ 1 - 0
setup.py

@@ -17,6 +17,7 @@ EXCLUDE_FILES = {
     "setup.py",  # 不编译本文件
     "cythonize.py",  # 不编译辅助脚本
     "check_deploy.py",  # 不编译部署检查
+    "terminal_demo.py",  # 不编译终端演示文件
 }
 
 # 定义要排除的目录