【问题标题】:where to place my erlang library module myerlib.erl into elixir tree directory for calling from elixir modules将我的 erlang 库模块 myerlib.erl 放入 elixir 树目录的位置,以便从 elixir 模块调用
【发布时间】:2015-11-13 21:39:10
【问题描述】:

我有 myerlib/src/myerlib.erl erlang 库模块,我需要从 Elixir 模块调用它的函数。 我也可以从 elixir 代码中调用 myerlib 模块函数:myerlib.function(.....) 但是

如果我将 myerlib 子目录放在 deps/elixir 目录下并使用 mix.exs:

def deps do
  [
    {:myerlib, path: "deps/myerlib"}
    # ...
  ]
end

然后当我做iex -S mix 我得到这个错误:

*** (Mix) :path 选项只能用于混合项目,对 :myerlib 的路径依赖无效

【问题讨论】:

    标签: elixir


    【解决方案1】:

    如果您有一个src 目录,其中包含.erl 文件,那么它们将在您运行mix.compile 时被编译(使用mix compile 或隐式使用iex -S mix 之类的东西)。

    您可以在mix compile.erlang 任务中看到这一点。这可以是默认路径src,但可以通过修改mix.exs 文件中的erlc_paths 选项来更改。

    def project do
      [app: :my_app,
       version: "0.0.1",
       elixir: "~> 1.0",
       erlc_paths: ["foo"], # ADD THIS OPTION
       build_embedded: Mix.env == :prod,
       start_permanent: Mix.env == :prod,
       deps: deps]
    end
    

    【讨论】:

      【解决方案2】:

      今天早上我在这里找到了一个解决方案:

      https://github.com/alco/erlang-mix-project

      为什么这个链接回答这个问题本质上是:

      1.- 我们在 rssutil/ 下有一个 elixir 主项目

      2.- 我们有一个 myerlib.erl erlang 库,我们需要从我们在 rssutil/lib/ 下的 elixir 代码中使用它

      3.- 一种解决方案是创建 rssutil/src/ 并复制 myerlib.erl 并编译,就像第一个答案之前告诉我们的那样。

      4.- 但我们想像 elixir proyects 一样管理我们的 erlang 库。为此,我们需要 elixir,将 myerlib erlang 库视为 elixir proyect。

      5.- 然后在 rssutil/mix.exs 中像 dep 一样添加 myerlib

      defp deps do
       [..........
             {:myerlib, path:deps/myerlib"}
       ]
      end
      

      6.- 我们需要使用下一个 mix.exs 文件创建 rssutil/deps/myliberl/:

      defmodule Myerlib.Mixfile do
        use Mix.Project
      
        def project do
          [app: :myerlib,
           version: "0.0.1",
           language: :erlang,
           deps: deps]
        end
      
        def application do
          [applications: [], mod: {:myerlib, []}]
        end
      
        defp deps do
          [
            {:mix_erlang_tasks, "0.1.0"},
          ]
        end
      end
      

      观察语言现在是 erlang,我们需要像 myerlib 的 dep/

      mix_erlang_tasks

      7.- 还使用您的“旧”erlang 代码创建 rssutil/deps/myerlib/src/myerlib.erl

      8.- 在您拥有最后一个 mix.exs 文件的 rssutil/deps/myerlib/ 目录中,写入

      $ mix deps.get
      $ mix compile
      

      9.- 转到 rssutil/ 目录,也可以

      $ mix deps.get
      $ iex -S mix
      

      10.- 最后,您可以在 myerlib.erl 中调用 erlang 的函数:

      iex> :myerlib.any_function_you_know_to_have_here(...)

      就是这样。

      无论如何,非常感谢。

      【讨论】:

        猜你喜欢
        • 2013-12-05
        • 2016-10-20
        • 2017-12-13
        • 1970-01-01
        • 2018-09-14
        • 2018-10-26
        • 2014-10-30
        • 2018-11-26
        • 2016-01-30
        相关资源
        最近更新 更多