2017-04-27 121 views
2

Elixir/Erlang application可能具有相關的應用程序。正如文件:我該如何使用應用程序作爲依賴關係

您可以通過在mix.exs與 下列選項定義應用程序/ 0功能配置產生 應用:

• :applications - all applications your application depends on at 
    runtime. By default, this list is automatically inferred from your 
    dependencies. Any extra Erlang/Elixir dependency must be specified in 
    :extra_applications. Mix and other tools use the application list in order 
    to start your dependencies before starting the application itself. 
• :extra_applications - a list of Erlang/Elixir applications that you 
    want started before your application. For example, Elixir's :logger or 
    Erlang's :crypto. 

這些相關的應用程序將全部開始前開始我的申請。到現在爲止還挺好。

applications鍵需要一個原子列表,它不允許元組。這使得不可能將參數傳遞給Application.start/2

是否有通過start_args到相關應用任何可靠的方法,還是我不得不調整與手動MyApp.start(:normal, [:hello])默認行爲?

如果答案是「是」,我怎麼能也開始同相關應用start_args不同列表兩次

+0

我不確定傳遞參數,但我相信你無法多次啓動一個應用程序。 – michalmuskala

+0

這有什麼理由嗎?如果我有兩個不同的redis源代碼,那麼有兩個應用程序處理這些代碼會更方便。我錯過了什麼嗎? – mudasobwa

+0

您不需要應用程序的多個實例來支持多個Redis連接。只需使用您自己的應用程序的監督樹以不同的參數多次調用'Redix.start_link()'。 –

回答

2

簡短的回答是否定的。 Elixir並沒有將所有相同的應用程序多次啓動。但是,你可能會做一些技巧。

通過在代碼中添加app: false,該應用程序不會自動啓動。

{:my_dep, "...", app: false} 

然後你可以從你的主應用程序啓動它。

MyDep.Application.start(...) 

然後,您可以在主管理員的早期啓動應用程序中的其他工作人員。

你需要在應用程序中注意的一些事情。

  • 應用程序是否使用命名的進程?這將是一個問題。
  • 該應用程序是否具有全局配置?這可能是一個問題。

但是,所有這些都取決於您嘗試使用的依賴關係。

+0

'應用程序:false'是一個關鍵,謝謝。我理解了命名進程引發的問題(應用程序是我的,我的名字是「全局應用程序名稱」,這就是爲什麼我問「如何首先傳遞參數」),全局配置也不是問題因爲在啓動應用程序之前,我總是可以管理配置。 – mudasobwa

+0

我在想,如果這是你自己的應用程序。這使得它很簡單:) –

+0

老實說,我沒有看到任何理由不允許通過在'應用程序「回調中的'{:myapp,[[name:'Blah',...]]}'(假設應用程序是隨時可以啓動多次)。畢竟,應用程序可以啓動多個主管,他們又可能啓動多個工作人員,並出現相同的命名問題。我相信它可能植根於OTP核心結構。 – mudasobwa

相關問題