Ash项目能否配置多个registry.ex?报错问题如何解决
参考Ash官方入门教程的目录结构时,对其中的support是否属于API存在疑惑。项目中把registry.ex放在根目录下能正常运行,但按照教程尝试在geo和legacy模块下各放一个registry.ex后,编译报错:
Resources Feriendaten.Geo.Location, Feriendaten.Geo.Level must be included in the registry
想知道是教程路径有误导还是操作有误,以及该如何修复?
问题根源
核心原因是Ash Registry的绑定逻辑没配置正确:每个Ash API必须关联对应的Registry,且Registry需要明确声明管辖的所有资源。拆分Registry到子模块后,你没完成API与子Registry的绑定,也没在子Registry中添加对应资源的声明,导致Ash编译时找不到资源的归属Registry。
修复步骤
配置子Registry的资源条目
在geo模块下的registry.ex中,显式添加该模块下的所有资源,示例代码:defmodule Feriendaten.Geo.Registry do use Ash.Registry, extensions: [Ash.Registry.ResourceValidations] entries do entry Feriendaten.Geo.Location entry Feriendaten.Geo.Level end end绑定子API与对应Registry
在geo模块的API定义中,指定关联的子Registry,示例:defmodule Feriendaten.Geo do use Ash.Api resources do registry Feriendaten.Geo.Registry end end对
legacy模块重复上述两步操作即可。清理根目录的冲突配置
如果根目录保留了原来的Registry或API模块,确保它不再引用geo/legacy下的资源,避免Registry管辖范围冲突;如果根API已不需要,直接移除相关配置。
关于support目录的说明
Ash教程里的support目录不属于API范畴,它是用来存放通用工具、自定义扩展、共享辅助逻辑的目录,比如自定义认证策略、数据转换函数等,不需要绑定Registry,也不会参与资源的管辖配置。
内容的提问来源于stack exchange,提问作者wintermeyer

