如何将Elixir依赖项导入当前文件/模块

Emi*_*ily 5 elixir elixir-framework phoenix-framework

我正在尝试使用十六进制打包的CSV。

我将依赖添加到mix.exs中,如下所示:

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

  defp deps do
    [
      {:csv, "~> 1.4.2"}
    ]
Run Code Online (Sandbox Code Playgroud)

然后,我运行mix deps.getmix deps.compile在终端。

依赖文件夹显示在deps文件夹中。

在尝试使用依赖项之前,一切似乎都还不错。我收到此错误:

“未加载模块CSV,无法找到”

我试过一个简单的用途,而无需像这样导入:

File.stream!("data.csv") |> CSV.decode
Run Code Online (Sandbox Code Playgroud)

我试过像这样导入:

import(CSV)
File.stream!("data.csv") |> CSV.decode
Run Code Online (Sandbox Code Playgroud)

我试过为deps目录加上前缀:

import(deps.CSV)
File.stream!("data.csv") |> CSV.decode
Run Code Online (Sandbox Code Playgroud)

以及deps子目录的完整路径:

import(deps.csv.lib.csv.CSV)
File.stream!("data.csv") |> CSV.decode
Run Code Online (Sandbox Code Playgroud)

无论似乎没有找到依赖模块。

我想念什么?

sdc*_*sdc 1

我猜你的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
Run Code Online (Sandbox Code Playgroud)
iex(1)> [["name", "age"], ["Bob Saget", 64]] |> CSV.encode() |> Enum.join("")
"name,age\r\nBob Saget,64\r\n"
Run Code Online (Sandbox Code Playgroud)

模块是全局可访问的,因此不需要使用该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)
Run Code Online (Sandbox Code Playgroud)

哪个应该输出类似这样的内容

["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"]
Run Code Online (Sandbox Code Playgroud)