给定一个看起来像这样的 Erlang sys.config :
[
{mousetrap, [
{slack_user, "mousetrap"},
{slack_channel, "#mousetrap"},
{slack_token, "<slack token here>"},
{pins_export_file, "/sys/class/gpio/export"},
{pins_root_directory, "/sys/class/gpio/gpio"},
{pins, [
{gpio0, 30, "1 (over workshop door)"},
{gpio0, 31, "2 (by basement freezer)"},
{gpio1, 16, "3 (in the kitchen pantry)"},
{gpio0, 5, "4 (Not yet wired)"}
]},
{quiet_minutes, 5},
{pin_check_interval_seconds, 1}
]}
].
我想把它分开,以便每个组件的设置在配置文件中分开。例如,BeagleBone 的 pin_library 确实没有理由包含整个捕鼠器应用程序的知识,因此将其分解是有意义的。对于向 Slack 发送消息的 notification_library 也是如此:
[
{mousetrap, [
{pins, [
{gpio0, 30, "1 (over workshop door)"},
{gpio0, 31, "2 (by basement freezer)"},
{gpio1, 16, "3 (in the kitchen pantry)"},
{gpio0, 5, "4 (Not yet wired)"}
]},
{quiet_minutes, 5}
]},
{pin_server, [
{pins_export_file, "/sys/class/gpio/export"},
{pins_root_directory, "/sys/class/gpio/gpio"},
{pin_check_interval_seconds, 1}
]},
{notification_library, [
{slack_user, "mousetrap"},
{slack_channel, "#mousetrap"},
{slack_token, "<slack token here>"}
]}
].
但是,这不起作用,因为 pin_server 和 notification_library 不是应用程序,这是此构造在 sys.config 中所需要的。将这些设置分解为合适的类别的正确 Erlang 方法是什么,以便pin_library.erl可以改变使用:
{ok, PinsRootDirectory} = application:get_env(mousetrap, pins_root_directory),
使用
{ok, PinsRootDirectory} = application:get_env(pin_server, pins_root_directory),
编辑:
只是为了澄清为什么我认为这很重要。组件 pin_server 和 notification_library 尝试遵守SRP。但是当 pin_server 调用时application:get_env(mousetrap, pins_root_directory)
,它打破了 SRP 的墙,因为它在不应该有依赖关系的组件上创建了依赖关系。也就是说,在捕鼠器应用程序上。现在它不能在不更改代码的情况下在其他应用程序中重复使用。notification_library 也是如此。pin_server 可能适用于任何想要询问 BBB 引脚的应用程序。notification_library 在任何想要发送 Slack 通知的应用程序中都很有用。两者都不应该引用捕鼠器应用程序,因为他们不应该对该应用程序有任何“知识”。
编辑:
根据@michael 的指导,我首先在https://github.com/DonBranson/slack向单独的 OTP 库发出 slack 通知。