Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 39s
- 新增系统称号模板与效果配置表及相关CRUD接口 - 实现用户称号分配与抽奖效果应用逻辑 - 优化抽奖接口支持用户ID参数以应用称号效果 - 新增称号管理前端页面与分配功能 - 修复Windows时区错误与JSON字段初始化问题 - 移除无用管理接口代码并更新文档说明
2.4 KiB
2.4 KiB
问题定位
- 触发点在
internal/pkg/timeutil/timeutil.go:13-22:time.LoadLocation("Asia/Shanghai")在init中执行,失败则panic,并将time.Local设为中国时区。 - 在 Windows 无系统 IANA tzdata、且以
CGO_ENABLED=0交叉编译的静态二进制中,time包找不到Asia/Shanghai,导致启动时报错。
解决方案(按优先级)
- 方案A(推荐):嵌入 tzdata 到二进制
- 在应用入口
main.go增加空导入:_ "time/tzdata",使time包使用内嵌 IANA 数据库。 - 或在打包时添加构建标签:
-tags timetzdata(效果等同),无需改代码。
- 在应用入口
- 方案B(无代码变更):随程序分发
zoneinfo.zip- 复制
$GOROOT/lib/time/zoneinfo.zip到可执行文件同目录,运行前设置环境变量ZONEINFO指向该文件,例如:set ZONEINFO=%CD%\zoneinfo.zip。
- 复制
- 方案C(防御补充):去除
panic并提供容错- 在
timeutil初始化失败时,回退到固定东八区:time.FixedZone("CST", 8*3600),并设置time.Local,避免启动失败。
- 在
打包命令更新
- 将 README 中 Windows 打包命令更新为:
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags "-s -w" -tags timetzdata -trimpath -o build/bindbox.exe .
- 若采用方案B:在
build目录放置zoneinfo.zip,并在启动脚本/说明中加入set ZONEINFO=%~dp0zoneinfo.zip。
验证计划
- 本地编译并运行单测:覆盖
internal/pkg/timeutil的格式化与解析函数,确认Asia/Shanghai可加载且不崩溃。 - 人工验证:在 Windows 主机上执行
bindbox.exe并访问http://127.0.0.1:9991/system/health,字段time正常返回中国时区时间(参考internal/pkg/core/core.go:418-441与timeutil.CSTLayoutString())。
将实施的具体改动
- 若选A:
- 在
main.go增加_ "time/tzdata"导入。 - 更新 README 的 Windows 构建命令,加入
-tags timetzdata。
- 在
- 若选C(可选增强):
- 修改
internal/pkg/timeutil/timeutil.go,失败时不panic,改为固定时区回退并日志记录。
- 修改
回滚与兼容
- 方案A仅增加约 ~800KB 体积,无行为回滚风险。
- 方案C为防御性修改,兼容现有逻辑;若需恢复原严格行为,可还原为
panic。
请确认采用的方案(推荐选A;可附加选C增强健壮性)。确认后我将按上述步骤实施并提交更改、完成打包与验证。