在 elixir 中命名嵌套伞应用程序

Posted

技术标签:

【中文标题】在 elixir 中命名嵌套伞应用程序【英文标题】:Naming nesting umbrella apps in elixir 【发布时间】:2015-09-29 07:37:32 【问题描述】:

Umbrella 应用的行为与通过 mix 设置的普通应用非常相似。它们具有配置,可以作为一个整体启动。因此,随着应用程序的增长,应用程序可以扩展到伞式应用程序。我现在遇到了一种情况,我想将伞形应用定义为更大的伞形应用中的应用之一。

有什么好的理由不这样做吗?

还有命名空间应用程序的方法/约定吗? 例如

def project do
    [app: :"analytics.web",
     version: "0.0.1",
     deps_path: "../../deps",
     lockfile: "../../mix.lock",
     elixir: "~> 1.0",
     build_embedded: Mix.env == :prod,
     start_permanent: Mix.env == :prod,
     deps: deps]
  end

【问题讨论】:

【参考方案1】:

运行时的 Erlang 和 Elixir 应用程序有一个平面命名空间。它们可以相互依赖,创建树状依赖图。

Rebar 和 Mix 中的 Umbrella 项目(不是应用程序,因为没有单一的“应用程序”)主要是为了方便避免为多个相关和/或相互依赖的应用程序创建单独的存储库。

即使 Rebar 和 Mix 支持嵌套的伞式项目,我会说它只是混淆了普通应用程序的结构。你假装有一个没有嵌套的命名空间。

在应用程序名称中使用点也不是最好的主意,因为它们在 Erlang ('analytics.web') 和 Elixir (:"a.b") 中都存在问题。

我只会使用一个包含多个相互依赖的应用程序的总括项目:

.
├── README.md
├── apps
│   ├── analytics
│   ├── analytics_stats
│   ├── analytics_web
│   ├── other_a
│   ├── other_b
│   └── ...
├── config
│   └── config.exs
└── mix.exs
```

【讨论】:

说保护伞项目本身实际上是一个非常有用的改变

以上是关于在 elixir 中命名嵌套伞应用程序的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 elixir 中定义命名函数有两种方式?

如何检查 ETS Erlang/Elixir 中是不是存在命名表

Elixir重命名并包装Erlang模块?

Elixir/Erlang 中的命名函数是不是有等效于 __MODULE__ 的方法?

Elixir 中的命名函数和匿名函数有啥区别?

我啥时候应该生成混合伞和凤凰伞?