Путаница во время выполнения и библиотеки в эликсире - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь использовать библиотеку MQTT в эликсире, известном как Черепаха.Всякий раз, когда я использую iex -S mix, я могу заставить отправку сообщений работать.Однако, когда я использую mix start, чтобы начать задачу запуска, программа не будет работать.Я получаю ошибку unknown registry: Tortoise.Registry.

Я могу запустить супервизор для Черепахи без ошибок, только когда я пытаюсь запустить дочерний процесс для этого процесса с Tortoise.Supervisor.start_child, я получаю ошибку.

defmodule Mqtt.Begin do
require Tortoise
def start do

opts = [strategy: :one_for_one, name: Mqtt.Begin]
  {:ok, pid} = Tortoise.Supervisor.start_link(opts)

      {:ok, _} =
    Tortoise.Supervisor.start_child(Mqtt.Begin, [
      client_id: :a,
      handler: {Mqtt.Handler, [name: :a]},
      server: {Tortoise.Transport.Tcp, host: 'localhost', port: 1883},
      subscriptions: [{"share/share-group/bar", 0}] ])

При использовании библиотек extern в elixir вся библиотека создается с помощью deps.compile?Или мне нужно что-то делать дальше?

1 Ответ

0 голосов
/ 21 октября 2018

Похоже, это из-за принципов загрузки кода erlang. Когда вы запускаете приложение с помощью iex -S mix, erlang запускает его в interactive mode и автоматически загружает все модули.

mix start (вам следует позвонить mix run), кажется, запускает ваше приложение в embedded mode Во встроенном режиме код загружается при запуске в соответствии со сценарием загрузки.

http://erlang.org/doc/reference_manual/code_loading.html#code-loading

Чтобы все заработало, вы должны добавить :tortoise в список application в mix.exs:

def application do
    [
      extra_applications: [:logger, :ssl, :tortoise],
      mod: {Your.App, []}
    ]
end
...