Files
dujiao-nextandClaude Opus 4.7 9a7a34d928 feat: fullstack single-binary release support
- internal/web 包:build-tag 双模式(default no-op + fullstack embed)
  - embed admin/user SPA via //go:embed all:dist/{admin,user}
  - RegisterAdmin/RegisterUser 按 cfg.Web.AdminPath 配置挂载 SPA
  - ValidateAdminPath 校验 admin 路径不与 /api、/uploads、/health 冲突
  - admin index.html 启动时一次性把 __DJ_ADMIN_BASE__ 替换为
    "/"+strings.Trim(prefix,"/"),确保 base href 是绝对路径
- 路由:router.go 在 SetupRouter 末尾挂载 web.Enabled() 块
- 启动:main.go 自动 mkdir db/uploads/logs;release+默认 admin path 时打 warning
- 配置:WebConfig.AdminPath(默认 /admin),config.yml.example 加 web 段
- GoReleaser:增加 fullstack build (linux x amd64/arm64),archive
  dujiao-all_<tag>_Linux_<arch>.tar.gz 含 dujiao-server + config.yml.example +
  docker-compose.yml + README.md
- CI workflow:release.yml 在 GoReleaser 之前 cross-checkout 同 tag 的
  admin/user 仓库(public,无需 PAT),跑 build:fullstack/build,把 dist
  embed 到 internal/web/dist
- .gitignore 排除 internal/web/dist/

老用户兼容性:默认 go build 行为完全不变(DCE 把 internal/web 包整体消除,
仅多 64 字节 build-id metadata;现有 Docker 镜像 Dockerfile 不带 -tags 不受影响)。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 23:50:18 +08:00

33 lines
635 B
Go

//go:build fullstack
package web
import (
"embed"
"io/fs"
)
//go:embed all:dist/admin all:dist/user
var assets embed.FS
// Enabled 报告 fullstack 资源是否被 embed 进当前二进制。
func Enabled() bool { return true }
// AdminFS 返回 admin SPA 的子文件系统。
func AdminFS() fs.FS {
sub, err := fs.Sub(assets, "dist/admin")
if err != nil {
panic("embed: dist/admin missing: " + err.Error())
}
return sub
}
// UserFS 返回 user SPA 的子文件系统。
func UserFS() fs.FS {
sub, err := fs.Sub(assets, "dist/user")
if err != nil {
panic("embed: dist/user missing: " + err.Error())
}
return sub
}