{"record":{"id":"e63f876fcd1d9d14","repo":"ent/ent","slug":"creating-generate-go-file-w","errorCode":null,"errorMessage":"creating generate.go file: %w","messagePattern":"creating generate\\.go file: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/internal/base/base.go","lineNumber":316,"sourceCode":"\t\t\treturn fmt.Errorf(\"writing file %s: %w\", newFileTarget, err)\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc createDir(target string) error {\n\t_, err := os.Stat(target)\n\tif err == nil || !os.IsNotExist(err) {\n\t\treturn err\n\t}\n\tif err := os.MkdirAll(target, os.ModePerm); err != nil {\n\t\treturn fmt.Errorf(\"creating schema directory: %w\", err)\n\t}\n\tif target != defaultSchema {\n\t\treturn nil\n\t}\n\tif err := os.WriteFile(\"ent/generate.go\", []byte(genFile), 0644); err != nil {\n\t\treturn fmt.Errorf(\"creating generate.go file: %w\", err)\n\t}\n\treturn nil\n}\n\nfunc fileExists(target, name string) bool {\n\tvar _, err = os.Stat(filepath.Join(target, strings.ToLower(name+\".go\")))\n\n\treturn err == nil\n}\n\nconst (\n\t// default schema package path.\n\tdefaultSchema = \"ent/schema\"\n\t// ent/generate.go file used for \"go generate\" command.\n\tgenFile = \"package ent\\n\\n//go:generate go run -mod=mod entgo.io/ent/cmd/ent generate ./schema\\n\"\n\t// schema template for the \"init\" command.\n\tdefaultTemplate = `package schema\n","sourceCodeStart":298,"sourceCodeEnd":334,"githubUrl":"https://github.com/ent/ent/blob/69d5d4deb19599f129166634e09d33addcf3f2cc/cmd/internal/base/base.go#L298-L334","documentation":"After creating the default ent/schema directory, createDir writes a template ent/generate.go that wires up the codegen entrypoint. This error wraps the os.WriteFile failure. It only occurs when target == defaultSchema (ent/schema), since only that layout gets the generate.go stub.","triggerScenarios":"Running `ent init` such that the default ent/schema directory is created (or already exists) and os.WriteFile(\"ent/generate.go\", ...) fails due to permissions, a directory named generate.go in the way, or a read-only disk.","commonSituations":"Generating in a read-only container/CI workspace; a vendored ent/generate.go path that is read-only; a directory named 'generate.go' accidentally created by a script.","solutions":["Ensure the ent/ directory is writable by the current user (chmod/chown).","Remove any directory or conflicting entry named generate.go under ent/.","Write the generate.go file manually with 0644 permissions if the stub is missing after init.","Check the wrapped OS error via errors.Unwrap for the precise cause."],"exampleFix":"// before\n$ ls ent  // generate.go/  (a directory!)\n// after\n$ rm -r ent/generate.go && ent init User  // writes ent/generate.go stub","handlingStrategy":"validation","validationCode":"gp := filepath.Join(\"ent\", \"generate.go\")\nif fi, err := os.Stat(gp); err == nil && fi.IsDir() {\n    return fmt.Errorf(\"%s is a directory; remove it before ent init\", gp)\n}\nif err := os.WriteFile(gp, nil, 0644); err != nil {\n    return fmt.Errorf(\"ent/ not writable: %w\", err)\n}","typeGuard":null,"tryCatchPattern":"if err := createDir(defaultSchema); err != nil {\n    var perr *fs.PathError\n    if errors.As(err, &perr) {\n        log.Fatalf(\"cannot write ent/generate.go: %v (path %s, op %s)\", perr.Err, perr.Path, perr.Op)\n    }\n    return err\n}","preventionTips":["Keep the ent/ directory user-writable (0644/0755)","Check for path collisions named generate.go before codegen","In containers, run codegen as the image's owning user, not root-only paths","Commit the generated ent/generate.go so init only runs once"],"tags":["filesystem","go","ent","codegen","permissions"],"backgroundTag":"file-write-permission-denied","analyzedSha":"69d5d4deb19599f129166634e09d33addcf3f2cc","analyzedAt":"2026-09-03T16:51:39.799Z","contentChangedAt":"2026-09-03T16:51:39.799Z","schemaVersion":2},"datasetVersion":"2026-09-11T00:17:11.886Z"}