flipped-aurora/gin-vue-admin · error

package结构异常,缺少router/%s/enter.go

Error message

package结构异常,缺少router/%s/enter.go

What it means

checkPackage validates the router skeleton for package-type generation: router/<Pkg>/enter.go must exist under the configured server root. If os.Stat fails, Create aborts, since generated router code is aggregated through this enter.go.

Source

Thrown at server/service/system/auto_code_template.go:50

}

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 {
	autoCodeCreateMu.Lock()
	defer autoCodeCreateMu.Unlock()

	// Frontend files are published last, but their Vite refresh may still cancel
	// the HTTP request before the handler returns. The accepted create task must finish.

View on GitHub (pinned to 3136500ef3)

Solutions

  1. Create server/router/<Pkg>/enter.go with the router aggregation struct/var and register it in server/router/enter.go.
  2. Align directory names across api/v1, service, and router for the same Pkg.
  3. Verify autoCode.root and autoCode.server in config.yaml point at this project's server directory.
  4. Restore the file from git history if it was removed during refactoring.

Example fix

// before
server/router/foo/  // missing
// after
// server/router/foo/enter.go
type Router struct{}
var Foo = new(Router)
Defensive patterns

Strategy: validation

Validate before calling

routerEnter := filepath.Join(cfg.AutoCode.Root, cfg.AutoCode.Server, "router", pkg, "enter.go")
if _, err := os.Stat(routerEnter); err != nil {
    return fmt.Errorf("create server/router/%s/enter.go before generating", pkg)
}

Try / catch

if err := s.Create(info); err != nil {
    if strings.Contains(err.Error(), "缺少router") {
        // scaffold router enter.go then retry
    }
    return err
}

Prevention

When it happens

Trigger: autoCodeTemplate.Create with template="package" where the api and service enter.go files exist but router/<Pkg>/enter.go is missing.

Common situations: Partial manual scaffold (api/service created, router forgotten); router package deleted during refactor; AutoCode config pointing at a stale checkout; typo in Pkg so the directory name does not match.

Related errors


AI-assisted analysis of flipped-aurora/gin-vue-admin@3136500ef3 (2026-08-31). Data as JSON: /api/errors/6a48692b147e5c55. Report an issue: GitHub.