Модуль Elixir не был скомпилирован с документами

Я только вчера начал изучать эликсир. У меня есть файл User.exs. Это выглядит так:

defmodule User do
    @moduledoc """ 
    Defines the user struct and functions to handle users.
    """
    # functions and stuff go here...

end

Когда я запускаю iex, вот что происходит, когда я пытаюсь просмотреть документы:

iex(1)> c "user.exs"
[User]
iex(2)> h User
User was not compiled with docs

Любые идеи?


person Mark Karavan    schedule 28.02.2017    source источник
comment
Измените расширение файла на .ex.   -  person Aleksei Matiushkin    schedule 28.02.2017
comment
@mudasobwa Проблема остается, ничем не отличается.   -  person Mark Karavan    schedule 28.02.2017
comment
Обычно .exs не компилируется (это файл скрипта). Так что предложение @mudasobwa хорошее. Но если вы не используете микс-файл, я предлагаю вам добавить его.   -  person Onorio Catenacci    schedule 28.02.2017


Ответы (2)


c("user.exs") компилирует файл в памяти и не записывает байт-код (файл .beam) на диск, в то время как h/1 в настоящее время требует (подробности ниже), чтобы файл луча присутствовал на диске для работы. Вы можете заставить c хранить сгенерированный байт-код в текущем каталоге, что заставит h/1 работать с c("user.exs", "."):

$ ls
user.exs
$ cat user.exs
defmodule User do
  @moduledoc """
  Defines the user struct and functions to handle users.
  """
end
$ iex
Erlang/OTP 19 [erts-8.2] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Interactive Elixir (1.4.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> c("user.exs", ".")
[User]
iex(2)> h User

                                      User

Defines the user struct and functions to handle users.

iex(3)>
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
       (v)ersion (k)ill (D)b-tables (d)istribution
^C
$ ls
Elixir.User.beam user.exs

h/1 использует Code.get_docs/2 для получения документации, которая вызывает :code.get_object_code/1 для модуля. :code.get_object_code/1 в соответствии с документами, "Выполняет поиск в пути кода объектного кода модуля Модуль. Возвращает {Module, Binary, Filename} в случае успеха, иначе error."

person Dogbert    schedule 28.02.2017

Причина в том, что *.exs файлы предназначены для скриптинга и они не будут скомпилированы, а *.ex файлы будут скомпилированы эликсиром.

Если у вас нет проекта микса и только файл user.ex, попробуйте elixirc user.ex и после этого запустите iex и введите h User.

Если у вас смешанный проект, запустите iex из командной строки следующим образом: iex -S mix Это загрузит ваш проект и скомпилирует все *.ex файлы. Теперь введите h User.

Я попробовал оба способа сам, и оба работают.

Смотрите также:

person guitarman    schedule 28.02.2017
comment
Обратите внимание, что расширение не имеет значения для elixirc. elixirc user.exs тоже работает. - person Dogbert; 28.02.2017