- 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>
33 lines
635 B
Go
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
|
|
}
|