@echo off setlocal rem ============================================================ rem [编码提醒] 本文件必须保存为 GBK / ANSI 编码,CRLF 行尾。 rem 存成 UTF-8 会让 cmd 解析中文出错,脚本直接跑不起来。 rem 用 VS Code 编辑时,右下角编码要选 GB2312/GBK 再保存。 rem ============================================================ rem cmsp 打包脚本 rem rem 双击本文件,把程序打包成一个 exe,可以直接发给同事使用。 rem 产物在 build\bin\cmsp.exe。 rem rem 只是想改代码看效果,请双击 run_dev.bat,不要用这个。 rem 打包比开发模式慢很多。 rem rem 遇到报错先看提示里的「怎么修」,照着做通常就好了。 rem 实在解决不了,把整个黑窗口截图发给维护者。 rem ============================================================ cd /d "%~dp0" echo. echo ============================================================ echo cmsp 打包 echo ============================================================ echo. rem ---------- 检查 1:Go ---------- echo [1/6] 检查 Go ... where go >nul 2>nul if errorlevel 1 ( echo. echo [X] 没有找到 go 命令。 echo. echo 怎么修: echo 1. 到 https://go.dev/dl/ 下载 Go 并安装 echo 2. 装完关掉这个窗口,重新双击本脚本 echo ^(装完必须重开窗口,否则读不到新的 PATH^) echo. goto :fail ) for /f "tokens=3" %%v in ('go version') do set GOVER=%%v echo OK %GOVER% rem ---------- 检查 2:Node ---------- echo [2/6] 检查 Node.js ... where node >nul 2>nul if errorlevel 1 ( echo. echo [X] 没有找到 node 命令。 echo. echo 怎么修:到 https://nodejs.org/ 下载 LTS 版本安装, echo 装完关掉窗口重新双击本脚本。 echo. goto :fail ) for /f %%v in ('node --version') do set NODEVER=%%v echo OK %NODEVER% rem ---------- 检查 3:Wails CLI ---------- echo [3/6] 检查 Wails 命令行工具 ... set "WAILS=" where wails >nul 2>nul if not errorlevel 1 set "WAILS=wails" rem where 找不到时,去 Go 的默认安装目录再找一次。 rem 很多人装完 Go 工具没把 GOPATH 下的 bin 加进 PATH,这里兜住。 if not defined WAILS ( for /f "delims=" %%p in ('go env GOPATH') do ( if exist "%%p\bin\wails.exe" set "WAILS=%%p\bin\wails.exe" ) ) if not defined WAILS ( echo. echo [X] 没有找到 wails 命令。 echo. echo 怎么修:在这个窗口里执行下面这条命令,装完再重新双击本脚本 echo. echo go install github.com/wailsapp/wails/v2/cmd/wails@latest echo. echo 注意要装 v2,不要装 v3。本项目用的是 Wails v2 稳定版。 echo. goto :fail ) echo OK 找到 wails rem ---------- 检查 4:跑单元测试 ---------- rem 打包前先跑测试。测试不过就别打包,免得把坏版本发给同事。 echo [4/6] 运行单元测试 ... go test ./... if not errorlevel 1 ( echo OK 测试全部通过 goto :tests_done ) echo. echo [X] 单元测试没通过。 echo. echo 怎么修: echo 往上翻找 FAIL 开头的行,那里写了哪个测试失败、 echo 期望什么、实际是什么。先把代码改对再打包。 echo. if /i not "%~1"=="skiptest" ( echo 打包已停止,不把没通过测试的版本发出去。 echo. echo 确实要强行打包时执行:build.bat skiptest echo. goto :fail ) echo [!] 已按 skiptest 参数忽略测试失败,继续打包。 echo [!] 这个版本不要发给同事,先把测试修好。 echo. :tests_done rem ---------- 检查 5:前端依赖 ---------- echo [5/6] 检查前端依赖 ... if not exist "frontend\node_modules" ( echo node_modules 不存在,开始安装,第一次要几分钟 ... pushd frontend call npm install if errorlevel 1 ( popd echo. echo [X] npm install 失败。 echo. echo 怎么修: echo 1. 确认能上网 echo 2. 公司网络受限时换镜像源: echo npm config set registry https://registry.npmmirror.com echo 3. 还不行就删掉 frontend\node_modules 和 echo frontend\package-lock.json 再跑一次 echo. goto :fail ) popd echo 依赖安装完成 ) else ( echo OK 依赖已安装 ) rem ---------- 打包 ---------- echo [6/6] 开始打包,大约需要半分钟 ... echo. rem -clean 会先清掉上次的产物,避免新旧文件混在一起。 "%WAILS%" build -clean if errorlevel 1 ( echo. echo [X] 打包失败。 echo. echo 常见原因: echo - Go 代码有编译错误:往上翻找报错行 echo - 上一个 cmsp.exe 还在运行,文件被占用: echo 关掉正在运行的 cmsp 窗口再试 echo - 依赖没下全:执行 go mod download 后重试 echo. goto :fail ) if not exist "build\bin\cmsp.exe" ( echo. echo [X] 打包命令没报错,但没找到 build\bin\cmsp.exe echo 请把这个窗口截图发给维护者。 echo. goto :fail ) echo. echo ============================================================ echo 打包成功 echo ============================================================ echo. echo 产物:%CD%\build\bin\cmsp.exe for %%f in ("build\bin\cmsp.exe") do echo 大小:%%~zf 字节 echo. echo 发给同事时的注意事项: echo - 只发 cmsp.exe 就够了,它已经把界面打包进去了 echo - [必须] 不要把 config.yaml 一起发出去,里面有账号密码 echo - [必须] 不要把 cmsp.db 一起发出去,里面有登录状态 echo - 对方第一次打开后,到「参数设置」页填自己的账号 echo. echo 对方电脑需要装: echo - Microsoft Edge WebView2 运行时 echo ^(Win10 一般自带;没有的话程序会提示去装^) echo - Google Chrome ^(用来登录淘宝^) echo - ffprobe ^(用来校验下载的视频是否完整^) echo. rem 打开产物所在目录,省得手动找。 rem 用 start 而不是直接 explorer:某些环境下 explorer 拿到未展开的 rem 环境变量,会在当前目录建出 %SystemDrive% 这种垃圾文件夹。 if exist "%~dp0build\bin" start "" explorer "%~dp0build\bin" goto :done :fail echo. echo ============================================================ echo 打包失败。上面写了怎么修,照着做通常就好。 echo 解决不了就把这个窗口截图发给维护者。 echo ============================================================ echo. pause exit /b 1 :done pause exit /b 0