Как импортировать зависимости эликсира в текущий файл / модуль

Я пытаюсь использовать пакет Hex CSV.

Я добавил зависимость в mix.exs примерно так:

  def application do
    [applications: [:logger, :csv]]
  end

  defp deps do
    [
      {:csv, "~> 1.4.2"}
    ]

Затем я бегу mix deps.get & mix deps.compile в терминале.

Папка зависимостей отображается в папке deps.

Кажется, все в порядке, пока я не попытаюсь использовать зависимость. Я получаю эту ошибку:

"модуль CSV не загружен и не может быть найден"

Я попытался просто использовать без импорта, вот так:

File.stream!("data.csv") |> CSV.decode

Я попытался импортировать так:

import(CSV)
File.stream!("data.csv") |> CSV.decode

Я пробовал префикс каталога deps:

import(deps.CSV)
File.stream!("data.csv") |> CSV.decode

И полный путь к подкаталогу deps:

import(deps.csv.lib.csv.CSV)
File.stream!("data.csv") |> CSV.decode

Неважно, что он не находит модуль зависимости.

Что мне не хватает?

0 ответов

Я предполагаю, что ваша IDE неправильно сконфигурирована. Вот пример командной строки того, как начать работу.

mix new csv_tester
cd csv_tester
# edit mix.exs to add {:csv, "~> 1.4"} to your deps, like you have above
mix deps.get
iex -S mix
iex(1)> [["name", "age"], ["Bob Saget", 64]] |> CSV.encode() |> Enum.join("")
"name,age\r\nBob Saget,64\r\n"

Модули доступны по всему миру, поэтому вам не нужно использовать importза исключением случаев, когда вам нужна только определенная функция в данном модуле или если вы не хотите полностью уточнять вызов функции с помощью имени модуля. См. Документацию по импорту.

Все, что вы можете выполнить в iex вы должны иметь возможность звонить из любого другого модуля в вашем проекте

Если вам все еще нужна помощь в отладке, вы можете запустить это в iex, чтобы вывести список всех модулей, которые должны быть доступны во время выполнения, а затем отфильтровать все, что содержит CSV в имени модуля:

iex(1)> :code.get_path() |> 
  Enum.map(&to_charlist/1) |> 
  Enum.map(&:erl_prim_loader.list_dir/1) |> 
  Enum.map(&elem(&1, 1)) |> 
  Enum.concat() |> 
  Enum.map(&to_string/1) |> 
  Enum.filter(fn module -> module =~ "CSV" end)

Что должно вывести что-то вроде этого

["Elixir.CSV.Encode.beam", "Elixir.CSV.Encoder.beam", "Elixir.CSV.beam",
 "Elixir.CSV.Lexer.EncodingError.beam", "Elixir.CSV.LineAggregator.beam",
 "Elixir.CSV.Parser.beam", "Elixir.CSV.Lexer.beam",
 "Elixir.CSV.Encode.BitString.beam",
 "Elixir.CSV.LineAggregator.CorruptStreamError.beam", "Elixir.CSV.Decoder.beam",
 "Elixir.CSV.Decoder.RowLengthError.beam", "Elixir.CSV.Encode.beam",
 "Elixir.CSV.Parser.SyntaxError.beam", "Elixir.CSV.Encode.Any.beam",
 "Elixir.CSV.Defaults.beam"]
Другие вопросы по тегам