2017-04-26 97 views
2

我试图用一个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取出的目录就可以编译里面,但在凤凰启动时,我得到以下错误:

** (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 

是否有另一步做,使其工作?

回答

2

刚刚发现了简便的混合选项传递:

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

为了防止混淆从试图加载封装应用程序文件。

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

注意:您可以使用:compile选项去掉一个Emakefile包的手工编制的,在这种情况下:

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

我想这也照顾'erlc_paths'。我刚刚意识到我的例子是在我的项目中包含Erlang代码,而不是作为依赖项。 –

+0

只需注意,这是Elixir 1.4中的新功能。 –

0

编辑

我下面的例子是包括在一个花好月圆项目二郎来源,而不是作为一个依赖作为问的问题。我在这里留下帖子,以防万一它可以帮助别人如何试图获得他们的Erlang代码编译。

它已经有一段时间,因为我已经做到了,但回头看以前的项目,我看到我的mix.exs文件中的以下内容:

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

这应该得到它与混合自动编译。

查看您提供的qrcode的源代码后,它不是应用程序。所以我不相信你可以添加你的applications:列表。相反,你应该可以像任何Erlang库一样使用它,如:qrcode.encode(...)

+1

:QR码是不是在我的组合应用程序上市文件,但仍似乎默认尝试加载它作为应用程序。 – Kernael

+0

@Kernael感谢您的分享。我从来没有尝试过从依赖中使用非应用程序。将来你可能会为我节省一些时间。 –