flipped-aurora/gin-vue-admin · error
package结构异常,缺少service/%s/enter.go
Error message
package结构异常,缺少service/%s/enter.go
What it means
checkPackage validates the service layer skeleton for package-type generation: service/<Pkg>/enter.go must exist under the configured server root. When os.Stat fails, Create aborts with this error, because generated service code registers itself through that enter.go aggregate.
Source
Thrown at server/service/system/auto_code_template.go:45
type autoCodeTemplate struct{}
func autoCodeCreateContext(ctx context.Context) context.Context {
return context.WithoutCancel(ctx)
}
func (s *autoCodeTemplate) checkPackage(Pkg string, template string) (err error) {
switch template {
case "package":
apiEnter := filepath.Join(global.GVA_CONFIG.AutoCode.Root, global.GVA_CONFIG.AutoCode.Server, "api", "v1", Pkg, "enter.go")
_, err = os.Stat(apiEnter)
if err != nil {
return fmt.Errorf("package结构异常,缺少api/v1/%s/enter.go", Pkg)
}
serviceEnter := filepath.Join(global.GVA_CONFIG.AutoCode.Root, global.GVA_CONFIG.AutoCode.Server, "service", Pkg, "enter.go")
_, err = os.Stat(serviceEnter)
if err != nil {
return fmt.Errorf("package结构异常,缺少service/%s/enter.go", Pkg)
}
routerEnter := filepath.Join(global.GVA_CONFIG.AutoCode.Root, global.GVA_CONFIG.AutoCode.Server, "router", Pkg, "enter.go")
_, err = os.Stat(routerEnter)
if err != nil {
return fmt.Errorf("package结构异常,缺少router/%s/enter.go", Pkg)
}
case "plugin":
pluginEnter := filepath.Join(global.GVA_CONFIG.AutoCode.Root, global.GVA_CONFIG.AutoCode.Server, "plugin", Pkg, "plugin.go")
_, err = os.Stat(pluginEnter)
if err != nil {
return fmt.Errorf("plugin结构异常,缺少plugin/%s/plugin.go", Pkg)
}
}
return nil
}
// Create 创建生成自动化代码
func (s *autoCodeTemplate) Create(ctx context.Context, info request.AutoCode) error {View on GitHub (pinned to 3136500ef3)
Solutions
- Create server/service/<Pkg>/enter.go with the package-level aggregation var and register it in server/service/enter.go.
- Check the package name spelling matches across api/, service/, router/ directories.
- Confirm autoCode.root/server config resolves to the real server tree (an existing enter.go elsewhere means config is wrong).
- Restore the deleted file from git history if it was accidentally removed.
Example fix
// before
server/service/foo/ // empty
// after
// server/service/foo/enter.go
type Service struct{}
var Foo = new(Service) Defensive patterns
Strategy: validation
Validate before calling
svcEnter := filepath.Join(cfg.AutoCode.Root, cfg.AutoCode.Server, "service", pkg, "enter.go")
if _, err := os.Stat(svcEnter); err != nil {
return fmt.Errorf("create server/service/%s/enter.go before generating", pkg)
} Try / catch
if err := s.Create(info); err != nil {
if strings.Contains(err.Error(), "缺少service") {
// scaffold service enter.go then retry
}
return err
} Prevention
- Create all three enter.go files (api/v1, service, router) together when adding a package
- Verify .gitignore does not exclude service subpackage files
- Keep package directory names identical across layers
When it happens
Trigger: autoCodeTemplate.Create with template="package" where api/v1/<Pkg>/enter.go exists but service/<Pkg>/enter.go does not — partial scaffold or wrong config root.
Common situations: User created only the api folder; git checkout with .gitignore excluding service subpackage; AutoCode.Server misconfigured so stats resolve elsewhere; package renamed in api but not in service.
Related errors
AI-assisted analysis of flipped-aurora/gin-vue-admin@3136500ef3 (2026-08-31).
Data as JSON: /api/errors/2f75cb2a8d711842.
Report an issue: GitHub.