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

  1. Create server/service/<Pkg>/enter.go with the package-level aggregation var and register it in server/service/enter.go.
  2. Check the package name spelling matches across api/, service/, router/ directories.
  3. Confirm autoCode.root/server config resolves to the real server tree (an existing enter.go elsewhere means config is wrong).
  4. 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

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.