【发布时间】:2016-04-07 20:41:58
【问题描述】:
在示例应用中试用 Elixir 和 Ecto(不是 Phoenix)来帮助我学习语言。
运行我的程序会导致以下错误:
=INFO REPORT==== 7-Apr-2016::16:23:28 ===
application: logger
exited: stopped
type: temporary
** (Mix) Could not start application tpos: exited in: Tpos.start(:normal, [])
** (EXIT) exited in: GenServer.call(#PID<0.164.0>, {:get_all, Tpos.Data.Models.ProfitCenter}, 5000)
** (EXIT) exited in: GenServer.call(#PID<0.163.0>, {:checkout, :run}, 5000)
** (EXIT) exited in: GenServer.call(#PID<0.168.0>, {:connect, [hostname: "localhost", timeout: 5000, otp_app: :tpos, repo: Tpos.Repo, adapter: Ecto.Adapters.MySQL, database: "tpos", username: "tpos", password: "tpos", port: 3306]}, 5000)
** (EXIT) an exception was raised:
** (UndefinedFunctionError) undefined function :crypto.hash/2 (module :crypto is not available)
(crypto) :crypto.hash(:sha, "tpos")
(mariaex) lib/mariaex/protocol.ex:150: Mariaex.Protocol.mysql_native_password/2
(mariaex) lib/mariaex/protocol.ex:47: Mariaex.Protocol.dispatch/2
(mariaex) lib/mariaex/connection.ex:284: Mariaex.Connection.process/2
(mariaex) lib/mariaex/connection.ex:251: Mariaex.Connection.handle_info/2
(stdlib) gen_server.erl:615: :gen_server.try_dispatch/4
(stdlib) gen_server.erl:681: :gen_server.handle_msg/5
(stdlib) proc_lib.erl:240: :proc_lib.init_p_do_apply/3
如果我执行mix deps.clean --all 和mix.deps get 并再次运行该程序,它就可以工作。但只有一次。如果我退出并尝试再次运行它,我会收到上述错误。
导致错误的行是:
data = Repo.all(ProfitCenter)
正如我所说,第一次运行良好并返回预期数据。只有在后续运行时才会弹出错误。
来自 mix.exs:
defmodule Tpos.Mixfile do
use Mix.Project
def project do
[app: :tpos,
version: "0.0.1",
elixir: "~> 1.2",
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
deps: deps]
end
def application do
[ applications: [:mariaex, :ecto],
mod: { Tpos, [] } ]
end
defp deps do
[
{:credo, "~> 0.3", only: [:dev, :test]},
{:mariaex, "~> 0.5.0"},
{:ecto, "~> 1.1.5"},
{:exactor, "~> 2.2.0"}
]
end
end
我正在运行 OS X 10.11.1,并根据this 等建议尝试了几种方法以使其运行。
想法?谢谢!
【问题讨论】:
-
我不是 100% 确定,但我认为您缺少 Erlang Crypto 库。
-
@SashaFonseca,那为什么它会起作用呢?
-
它只是在进行函数调用并且未找到该函数时崩溃:未定义函数:crypto.hash/2(模块:crypto不可用)通常Elixir会在以下情况下给出编译时错误有一个未定义的函数,但对于 Erlang 互操作性,它的工作方式可能有所不同。
-
没有。它工作一次。随后的运行会导致崩溃。所以在运行 #1 和运行 #2 之间发生了一些事情。
-
您使用的是哪个 MySQL 版本?我看到 5.5 出现了一些奇怪的问题