Elixir列出命名空间中的所有模块

use*_*306 2 erlang elixir phoenix-framework

我正在开发一个Elixir/Phoenix应用程序,用于在我的UserController控制器中创建用户.有一个/lib/helpers/user_helpers包含许多模块的目录(每个模块都在一个单独的文件中).这些模块都有一个共同的命名空间UserHelpers.ModuleName.在每个模块中,我都有一个apply我想要应用于用户数据的函数.例如,如果我有以下文件结构:

-lib
    -helpers
        -user_helpers
            -module1
            -module2
            -...
            -moduleN-1
            -moduleN
Run Code Online (Sandbox Code Playgroud)

其中每个module1module2包含一个apply(user_info)返回的函数user_info.在我的UserController我有create(conn, params)我想要运行以下功能:

user_data
|> UserHelpers.Module1.create
|> UserHelpers.Module2.create
|> ...
|> UserHelpers.ModuleN-1.create
|> UserHelpers.ModuleN.create
Run Code Online (Sandbox Code Playgroud)

但我不确定如何动态加载UserHelpers文件夹中的所有模块来执行上述操作.有什么建议?

Ale*_*kin 7

假设您的应用程序被调用:my_app并且帮助程序具有.ex扩展名和/或显式编译到您的应用程序中:

with {:ok, list} <- :application.get_key(:my_app, :modules) do
  list
  |> Enum.filter(& &1 |> Module.split |> Enum.take(1) == ~w|UserHelpers|)
  |> Enum.reduce(user_data, fn m, acc -> apply(m, :create, acc) end)
end
Run Code Online (Sandbox Code Playgroud)

:application.get_key(:my_app, :modules)返回该应用程序已知的模块列表.第二行过滤掉那些不需要的,后者将其:create功能应用于user_data其后.

您可能希望Enum.sort在最后一行之前嵌入以按适当顺序对模块进行排序.