OS X,Elixir,Ecto,Crypto,MySQL

时间:2016-04-07 20:41:58

标签: mysql elixir ecto

尝试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 --allmix.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之类的建议来实现它。

思考?谢谢!

1 个答案:

答案 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他们应该安装所有必需的依赖项,包括加密。