【问题标题】:How to Import Elixir Dependencies Into Current File/Module如何将 Elixir 依赖项导入当前文件/模块
【发布时间】:2020-08-17 11:36:58
【问题描述】:

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

不管它怎么好像都找不到依赖模块。

我错过了什么?

【问题讨论】:

  • [project_name]/lib/[project_name]/scratch_pads/scratch_pad_2.ex
  • 那么可能是 Atom 插件中的一个错误。您正在使用哪一个让您执行文件?同时,您可以使用 mix run lib/[project_name]/scratch_pads/scratch_pad_2‌​.ex 从 shell 运行代码。
  • 您不需要导入 CSV 模块,除非您想使用它的功能而不必完全限定它们。测试可用内容的最简单方法是运行iex -S mix,它将启动您的应用程序并打开一个iex shell,您可以在其中直接调用模块。

标签: phoenix-framework elixir


【解决方案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
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"]

【讨论】:

  • 鉴于:code.get_path() 返回的是字符列表列表,而不是字符串列表,|> Enum.map(&to_charlist/1) 不需要并且可以省略。更一般地说,“在与 Erlang 交互时,尤其是在使用旧库时”,参数和返回值往往是字符列表,而不是 UTF-8 二进制文件(在 Elixir 中也称为字符串)。
猜你喜欢
  • 2019-12-13
  • 2013-08-15
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多