Erlang 包加载失败

Erlang package failing to load

我想在我的 Phoenix 项目中使用 Erlang 包(这个:https://github.com/komone/qrcode),所以我只是想从我的混合文件中获取它:

  defp deps do
    [{:phoenix, "~> 1.3.0-rc"},
     {:phoenix_pubsub, "~> 1.0"},
     {:phoenix_ecto, "~> 3.2"},
     {:postgrex, ">= 0.0.0"},
     {:gettext, "~> 0.11"},
     {:cowboy, "~> 1.0"},
     {:comeonin, "~> 3.0"},
     {:uuid, "~> 1.1"},
     {:timex, "~> 3.1"},
     {:timex_ecto, "~> 3.1"},
     {:porcelain, "~> 2.0"},
     {:qrcode, git: "https://github.com/komone/qrcode"}, # <--
     {:credo, "~> 0.7", only: [:dev, :test]}]
  end

我不得不在获取的目录中手动 erl -make 以使其编译,但在 phoenix 启动时我收到以下错误:

** (Mix) Could not start application qrcode: exited in: :qrcode.start(:normal, [])
    ** (EXIT) an exception was raised:
        ** (UndefinedFunctionError) function :qrcode.start/2 is undefined or private
            (qrcode) :qrcode.start(:normal, [])
            (kernel) application_master.erl:273: :application_master.start_it_old/4

是否还有其他步骤才能让它发挥作用?

编辑

我下面的示例是将 Erlang 源代码包含在 Elixir 项目中,而不是作为所问问题的依赖项。我将 post 留在这里,以防它可以帮助其他人如何尝试编译他们的 Erlang 代码。

我完成它已经有一段时间了,但回顾以前的项目,我在 mix.exs 文件中看到以下内容:

def project do
  [ app: :mdse,
    # ...
    erlc_paths: ["./lib/mdse/rpc/src", "src"]
  ]
end

这应该会自动编译 mix。

查看您提供的 qrcode 的来源后,它不是应用程序。所以我认为您无法将其添加到您的 applications: 列表中。相反,你应该能够像 :qrcode.encode(...).

这样的任何 Erlang 库来使用它

刚刚找到方便的混合选项来传递:

{:qrcode, git: "https://github.com/komone/qrcode", app: false}

为了防止Mix尝试加载包应用文件。

https://hexdocs.pm/mix/Mix.Tasks.Deps.html

注意:您可以使用 :compile 选项来摆脱 Emakefile 包的手动编译,在这种情况下:

{:qrcode, git: "https://github.com/komone/qrcode", app: false, compile: "erl -make"}