我想创建类似插件系统的东西:一堆动态加载/卸载的模块,添加我插入/删除它们.
像这样的东西:
# plugin1.eex
defmodule MyApp.Plugins.Plugin1 do
def plugin_main_func(arg1, arg2) do
# some stuff
end
end
# plugin2.eex
defmodule MyApp.Plugins.Plugin2 do
def plugin_main_func(arg1, arg2) do
# some stuff 2
end
end
# plugin3.eex
defmodule MyApp.Plugins.Plugin3 do
def plugin_main_func(arg1, arg2) do
# some stuff 3
end
end
Run Code Online (Sandbox Code Playgroud)
它们将具有相同的通用功能 - "plugin_main_func" - 每个插件的实现方式都不同.在我的应用程序的某个地方我会有这个:
plugins = load_plugins()
Enum.each plugins, &(&1.plugin_main_func(1, "fdafdsfds"))
Run Code Online (Sandbox Code Playgroud)
然后我可以通过创建或删除适当的模块或文件来添加或删除插件.如果没有进行硬编码/添加/在应用程序中作为一个字符串列表的地方删除它们的名称以及.
我怎么能得到这个?
更新:
鉴于插件必须存在于MyApp.Plugins并且具有一个功能 plugin_main_func,我如何观察它们当前存在的插件列表?我只是想避免在某处硬编码他们的名字并加载或运行它们只有这两个条件足以找到所有的插件.
当我动态或半动态地找到它们时,我想以某种方式调用plugin_main_func每个插件.不知道插件的数量和它们的确切名称.怎么样?
我很好在编译之前加载它们,而不是在运行时.
您是否使用环境变量或prod.secret.exs用于存储密码,API密钥等?经验法则是什么?我觉得它们或多或少都是一样的,因此混淆了使用哪一个。
请注意,我不想通过在代码中合并第三方库来使其复杂化。我最好是开箱即用的解决方案。