能否扩展Phoenix生成器支持的自定义Ecto类型?
扩展Phoenix生成器支持自定义Ecto类型
问题描述
我有一个自定义Ecto类型:money_with_currency,希望在使用mix phx.gen.context生成新上下文时直接指定该类型,但生成器提示不支持这个类型:
期望执行命令:
mix phx.gen.context Invoicing Package packages price:money_with_currency
实际报错:
mix phx.gen.context Invoicing Package packages price:money_with_currency ** (Mix) Unknown type `:money_with_currency` given to generator. The supported types are: array, binary, boolean, date, decimal, enum, float, integer, map, naive_datetime, naive_datetime_usec, references, string, text, time, time_usec, utc_datetime, utc_datetime_usec, uuid
解决方案
方案1:全局配置扩展支持类型
在项目的config/config.exs中添加生成器配置,将自定义类型加入支持列表:
config :phoenix, :generators, ecto_types: [:money_with_currency | Phoenix.Generator.Ecto.default_types()]
保存配置后,再执行原来的生成命令就能成功识别自定义类型。
方案2:自定义生成器任务(按需定制)
如果需要对生成逻辑做更多扩展(比如自动导入自定义类型模块、添加字段验证),可以创建自定义生成器任务:
- 在项目中创建
lib/mix/tasks/phx.gen.context_custom.ex文件:
defmodule Mix.Tasks.Phx.Gen.ContextCustom do use Mix.Task @impl true def run(args) do # 临时扩展支持的Ecto类型 Application.put_env(:phoenix, :generators, ecto_types: [:money_with_currency | Phoenix.Generator.Ecto.default_types()] ) # 调用原生上下文生成器执行逻辑 Mix.Tasks.Phx.Gen.Context.run(args) end end
- 运行自定义生成器:
mix phx.gen.context_custom Invoicing Package packages price:money_with_currency
注意事项
- 确保自定义Ecto类型
:money_with_currency已经正确实现了Ecto.Type行为,生成器仅负责识别类型名称,实际的类型序列化/反序列化逻辑需要自行完成。 - 方案1是全局生效,所有Phoenix Ecto生成器(如
phx.gen.schema)都会识别该类型;方案2更适合需要单独定制生成流程的场景。
内容的提问来源于stack exchange,提问作者arete
相关产品推荐
相关产品推荐

