2017-04-26 90 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感謝您的分享。我從來沒有嘗試過從依賴中使用非應用程序。將來你可能會爲我節省一些時間。 –