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

时间:2016-09-14 03:56:38

标签: elixir phoenix-framework elixir-framework

我正在尝试使用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

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

我错过了什么?

1 个答案:

答案 0 :(得分: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语句名称。请参阅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"]