{"record":{"id":"eca0898063a3152e","repo":"flipped-aurora/gin-vue-admin","slug":"package-name","errorCode":null,"errorMessage":"不能使用已保留的package name","messagePattern":"不能使用已保留的package name","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"server/service/system/auto_code_package.go","lineNumber":42,"sourceCode":"\ntype autoCodePackage struct{}\n\n// Create 创建包信息\n// @author: [piexlmax](https://github.com/piexlmax)\n// @author: [SliverHorn](https://github.com/SliverHorn)\nfunc (s *autoCodePackage) Create(ctx context.Context, info *request.SysAutoCodePackageCreate) error {\n\tswitch {\n\tcase info.Template == \"\":\n\t\treturn errors.New(\"模板不能为空!\")\n\tcase info.Template == \"page\":\n\t\treturn errors.New(\"page为表单生成器!\")\n\tcase info.PackageName == \"\":\n\t\treturn errors.New(\"PackageName不能为空!\")\n\tcase token.IsKeyword(info.PackageName):\n\t\treturn errors.Errorf(\"%s为go的关键字!\", info.PackageName)\n\tcase info.Template == \"package\":\n\t\tif info.PackageName == \"system\" || info.PackageName == \"example\" {\n\t\t\treturn errors.New(\"不能使用已保留的package name\")\n\t\t}\n\tdefault:\n\t\tbreak\n\t}\n\tif !errors.Is(global.GVA_DB.Where(\"package_name = ? and template = ?\", info.PackageName, info.Template).First(&model.SysAutoCodePackage{}).Error, gorm.ErrRecordNotFound) {\n\t\treturn errors.New(\"存在相同PackageName\")\n\t}\n\tcreate := info.Create()\n\treturn global.GVA_DB.WithContext(ctx).Transaction(func(tx *gorm.DB) error {\n\t\terr := tx.Create(&create).Error\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"创建失败!\")\n\t\t}\n\t\tcode := info.AutoCode()\n\t\t_, asts, creates, err := s.templates(ctx, create, code, true)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}","sourceCodeStart":24,"sourceCodeEnd":60,"githubUrl":"https://github.com/flipped-aurora/gin-vue-admin/blob/3136500ef380842b0eb6c4daa87c3f8a47fcf9e0/server/service/system/auto_code_package.go#L24-L60","documentation":"Create also reserves the package names 'system' and 'example' when template == \"package\", because generated code would collide with gin-vue-admin's existing server module directories (server/system, server/example). Throwing early prevents overwriting/colliding with core modules.","triggerScenarios":"Creating an auto-code package with template=\"package\" and packageName set to the literal \"system\" or \"example\".","commonSituations":"Developers scaffolding a business package and picking 'system' thinking it extends the core system module; copied example payloads that still use packageName \"example\".","solutions":["Choose a different, non-reserved package name (e.g. 'biz-system', 'myadmin').","If extending the built-in system module, modify core code directly instead of generating a package named 'system'.","Rename the generated package folder after creation is impossible — pick the right name up front, since it maps to a server directory."],"exampleFix":"// before\n{ \"template\": \"package\", \"packageName\": \"system\" }\n// after\n{ \"template\": \"package\", \"packageName\": \"mysystem\" }","handlingStrategy":"validation","validationCode":"const RESERVED = ['system', 'example']\nif (form.template === 'package' && RESERVED.includes(form.packageName)) {\n  throw new Error('不能使用已保留的package name')\n}","typeGuard":null,"tryCatchPattern":"try {\n  await api.createPackage(payload)\n} catch (e) {\n  if (e?.msg?.includes('保留')) {\n    form.packageName = ''\n    notify('请更换包名，system/example 为保留名')\n  } else { throw e }\n}","preventionTips":["Keep a client-side denylist of reserved names mirroring the server.","Prefix business packages with your project namespace (e.g. 'acme-').","Never name generated packages after existing core modules."],"tags":["validation","autocode","naming"],"backgroundTag":"reserved-identifier","analyzedSha":"3136500ef380842b0eb6c4daa87c3f8a47fcf9e0","analyzedAt":"2026-08-31T13:50:02.721Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}