【问题标题】:Where do I put my modules in an Elixir mix application?在 Elixir 混合应用程序中,我应该把我的模块放在哪里?
【发布时间】:2017-03-05 03:37:37
【问题描述】:

我有一个简单的项目,我已经开始调用测试。所以我做了:

mix new test

我得到了通常的目录树。在lib目录下,是test.ex。但我希望 test.ex 使用一个名为 Mystuff 的模块,但我不知道将 mystuff.ex 放在哪里,因为我得到一个编译错误。

这里是 test.ex(在 test/lib 目录中):

defmodule Test do

  use Mystuff

  @moduledoc """
  Documentation for Test.
  """

  @doc """
  Hello world.

  ## Examples

      iex> Test.hello
      :world

  """
  def hello do
    Mystuff.bye()
  end
end

这里是 mystuff.ex,我也包含在 test/lib 中:

defmodule Test.Mystuff do
  def bye do
    IO.puts "bye"
  end
end

但是,如果我从项目的主目录(测试)运行“iex -S mix”,我会得到:

Erlang/OTP 19 [erts-8.2] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]

Compiling 3 files (.ex)

== Compilation error on file lib/test/mystuff.ex ==
** (CompileError) lib/test/mystuff.ex:1: cannot define module Test.Mystuff because it is currently being defined in lib/mystuff.ex:1
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6

那我是不是命名有误?用错了?放错目录了?

【问题讨论】:

  • 您定义了两次Test.MyStuff 模块。一次进入lib/test/mystuff.ex,另一个进入lib/mystuff.ex。更改其中一个名称,它应该可以编译。
  • 删除重复模块后,您还想了解import, alias, use and require之间的区别
  • 旁注: 测试应具有.exs 扩展名以防止其自动编译。没有ExUnit 本身和doctest 宏,ExUnit 测试毫无意义。

标签: elixir


【解决方案1】:

use Mystuff 替换为alias Test.Mystuff

【讨论】:

    猜你喜欢
    • 2011-03-22
    • 2020-09-30
    • 2014-01-30
    • 1970-01-01
    • 2016-08-25
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多