【问题标题】:OS X, Elixir, Ecto, Crypto, MySQLOS X, Elixir, Ecto, Crypto, MySQL
【发布时间】: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 --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 等建议尝试了几种方法以使其运行。

想法?谢谢!

【问题讨论】:

  • 我不是 100% 确定,但我认为您缺少 Erlang Crypto 库。
  • @SashaFonseca,那为什么它会起作用呢?
  • 它只是在进行函数调用并且未找到该函数时崩溃:未定义函数:crypto.hash/2(模块:crypto不可用)通常Elixir会在以下情况下给出编译时错误有一个未定义的函数,但对于 Erlang 互操作性,它的工作方式可能有所不同。
  • 没有。它工作一次。随后的运行会导致崩溃。所以在运行 #1 和运行 #2 之间发生了一些事情。
  • 您使用的是哪个 MySQL 版本?我看到 5.5 出现了一些奇怪的问题

标签: mysql elixir ecto


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

【讨论】:

  • 我知道错误是这样说的。令我困惑的是它只工作一次。如果一切工作都需要加密,而如果没有加密,那么我根本无法理解为什么它会起作用。
  • 您可以检查在第一次运行中是否调用了Mariaex.Protocol.mysql_native_password。也许第一次运行有点不同?您可以使用:dbg 跟踪有趣的模块并查看运行之间的差异。
猜你喜欢
  • 2014-11-01
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多