尝试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之类的建议来实现它。
思考?谢谢!
答案 0 :(得分:1)
错误表明您没有:crypto
模块。您可以通过运行验证:
iex(1)> Application.start(:crypto)
:ok
如果您得到的不是:ok
,则表示您的Erlang安装功能不完整。当您通过kerl
安装Erlang时,它经常发生。 Kerl并不认为缺少openssl是一个错误。它只是在没有警告的情况下跳过了crytpo库。
要使用kerl安装功能齐全的Erlang,您需要运行:
brew install openssl
brew install unixodbc
之后创建~/.kerlrc
文件,其中包含以下内容:
KERL_INSTALL_MANPAGES=yes
KERL_CONFIGURE_OPTIONS="--disable-hipe --enable-smp-support --enable-threads
--enable-kernel-poll --with-wx
--with-ssl=/usr/local/opt/openssl
--with-odbc=/usr/local/opt/unixodbc"
尝试重新安装Erlang。如果您想运行wx-widgets
应用程序,此配置还会添加:observer
,这很方便。 Unixodbc也可以派上用场,但不太常见。
如果您使用不同的工具来安装Erlang,则仍需要在编译期间将其指向openssl路径。
或者,您可以使用Erlang Solutions提供的软件包:https://www.erlang-solutions.com/resources/download.html他们应该安装所有必需的依赖项,包括加密。