grpc-ecosystem/grpc-gateway · error

no file %s found

Error message

no file %s found

What it means

When applying per-file options (RegisterOptions/applyOptions), each entry in opts.File must correspond to a file already loaded into the registry. If r.files has no entry for the given file name, the registry cannot attach the option and fails fast with this error.

Source

Thrown at internal/descriptor/registry.go:761

// SetProto3OptionalNullable set proto3OptionalNullable
func (r *Registry) SetProto3OptionalNullable(proto3OptionalNullable bool) {
	r.proto3OptionalNullable = proto3OptionalNullable
}

// GetProto3OptionalNullable returns proto3OptionalNullable
func (r *Registry) GetProto3OptionalNullable() bool {
	return r.proto3OptionalNullable
}

// RegisterOpenAPIOptions registers OpenAPI options
func (r *Registry) RegisterOpenAPIOptions(opts *openapiconfig.OpenAPIOptions) error {
	if opts == nil {
		return nil
	}

	for _, opt := range opts.File {
		if _, ok := r.files[opt.File]; !ok {
			return fmt.Errorf("no file %s found", opt.File)
		}
		r.fileOptions[opt.File] = opt.Option
	}

	// build map of all registered methods
	methods := make(map[string]struct{})
	services := make(map[string]struct{})
	for _, f := range r.files {
		for _, s := range f.Services {
			services[s.FQSN()] = struct{}{}
			for _, m := range s.Methods {
				methods[m.FQMN()] = struct{}{}
			}
		}
	}

	for _, opt := range opts.Method {
		qualifiedMethod := "." + opt.Method

View on GitHub (pinned to a58a4436a3)

Solutions

  1. Use the exact file name as passed to the registry load call (import-path-relative, e.g. 'path/to/file.proto')
  2. Load the referenced .proto file before registering options
  3. Remove stale entries from your options configuration for files no longer compiled
  4. Print/log the keys of loaded files and diff against opts.File entries

Example fix

// before
opts.File = append(opts.File, &FileOption{File: "/abs/path/api.proto", Option: ...})
// after
opts.File = append(opts.File, &FileOption{File: "api.proto", Option: ...})
Defensive patterns

Strategy: validation

Validate before calling

loaded, err := reg.GetAllFQMNs() // or track loaded file names at load time
for _, opt := range opts.File {
    if !loadedFiles[opt.File] {
        return fmt.Errorf("file %q not loaded; use import-path-relative name", opt.File)
    }
}
err = reg.RegisterOptions(opts)

Prevention

When it happens

Trigger: Calling the options-registration API with opts.File containing a file name that was never loaded via loadFile/Registry.Load, or loaded under a different (fully-qualified, proto-import-path-relative) name.

Common situations: Passing an absolute path or OS path instead of the proto-relative name used at load time; typo in file name; options file referencing a proto that was removed from the compile set; running the plugin against a subset of protos while the options file covers all.

Related errors


AI-assisted analysis of grpc-ecosystem/grpc-gateway@a58a4436a3 (2026-09-02). Data as JSON: /api/errors/76ef4cc3bb3639ef. Report an issue: GitHub.