ent/ent · error

creating generate.go file: %w

Error message

creating generate.go file: %w

What it means

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.

Source

Thrown at cmd/internal/base/base.go:316

			return fmt.Errorf("writing file %s: %w", newFileTarget, err)
		}
	}
	return nil
}

func createDir(target string) error {
	_, err := os.Stat(target)
	if err == nil || !os.IsNotExist(err) {
		return err
	}
	if err := os.MkdirAll(target, os.ModePerm); err != nil {
		return fmt.Errorf("creating schema directory: %w", err)
	}
	if target != defaultSchema {
		return nil
	}
	if err := os.WriteFile("ent/generate.go", []byte(genFile), 0644); err != nil {
		return fmt.Errorf("creating generate.go file: %w", err)
	}
	return nil
}

func fileExists(target, name string) bool {
	var _, err = os.Stat(filepath.Join(target, strings.ToLower(name+".go")))

	return err == nil
}

const (
	// default schema package path.
	defaultSchema = "ent/schema"
	// ent/generate.go file used for "go generate" command.
	genFile = "package ent\n\n//go:generate go run -mod=mod entgo.io/ent/cmd/ent generate ./schema\n"
	// schema template for the "init" command.
	defaultTemplate = `package schema

View on GitHub (pinned to 69d5d4deb1)

Solutions

  1. Ensure the ent/ directory is writable by the current user (chmod/chown).
  2. Remove any directory or conflicting entry named generate.go under ent/.
  3. Write the generate.go file manually with 0644 permissions if the stub is missing after init.
  4. Check the wrapped OS error via errors.Unwrap for the precise cause.

Example fix

// before
$ ls ent  // generate.go/  (a directory!)
// after
$ rm -r ent/generate.go && ent init User  // writes ent/generate.go stub
Defensive patterns

Strategy: validation

Validate before calling

gp := filepath.Join("ent", "generate.go")
if fi, err := os.Stat(gp); err == nil && fi.IsDir() {
    return fmt.Errorf("%s is a directory; remove it before ent init", gp)
}
if err := os.WriteFile(gp, nil, 0644); err != nil {
    return fmt.Errorf("ent/ not writable: %w", err)
}

Try / catch

if err := createDir(defaultSchema); err != nil {
    var perr *fs.PathError
    if errors.As(err, &perr) {
        log.Fatalf("cannot write ent/generate.go: %v (path %s, op %s)", perr.Err, perr.Path, perr.Op)
    }
    return err
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Understand the failure class

Background: "Permission denied" / "Failed to write" file errors: why a library can't write its files to disk (EACCES, EPERM, ENOSPC) and how to fix them — this error's family across 43 libraries.

Related errors


AI-assisted analysis of ent/ent@69d5d4deb1 (2026-09-03). Data as JSON: /api/errors/e63f876fcd1d9d14. Report an issue: GitHub.