繁体   English   中英

如何将 Elixir 库加载到 iex 而不将其添加到项目的 mix.exs 部门?

[英]How do I load an Elixir library into iex without adding it to a project's mix.exs deps?

我想在不创建混合项目的情况下试用 Poison json 模块。

如何安装它并通过导入使其在 iex 中可用?

我已经能够将它添加到项目中,然后在进入项目目录并使用 iex -S mix 后使用它:

tbrowne@LILJEN:~/code/elixirTry/pj$ cat mix.exs
defmodule Pj.Mixfile do
  use Mix.Project

  def project do
    [app: :pj,
     version: "0.0.1",
     elixir: "~> 1.2",
     build_embedded: Mix.env == :prod,
     start_permanent: Mix.env == :prod,
     deps: deps]
  end

  # Configuration for the OTP application
  #
  # Type "mix help compile.app" for more information
  def application do
    [applications: [:logger]]
  end

  # Dependencies can be Hex packages:
  #
  #   {:mydep, "~> 0.3.0"}
  #
  # Or git/path repositories:
  #
  #   {:mydep, git: "https://github.com/elixir-lang/mydep.git", tag: "0.1.0"}
  #
  # Type "mix help deps" for more examples and options
  defp deps do
    [{:poison, "~> 2.0"}]
  end
end
tbrowne@LILJEN:~/code/elixirTry/pj$ cat lib/pj.ex
defmodule Person do
  @derive [Poison.Encoder]
  defstruct [:name, :age]
end

defmodule Pj do
  xx = Poison.encode!(%Person{name: "Devin Torres", age: 27})
end

tbrowne@LILJEN:~/code/elixirTry/pj$ iex -S mix
Erlang/OTP 18 [erts-7.2] [source-e6dd627] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false]

Interactive Elixir (1.2.3) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> import Poison
nil
iex(2)>

但是,如果我只是进入通用目录中的普通 iex,那么我似乎无法访问 Poison 库:

iex(4)> import IO
nil
iex(5)> puts("hello")
hello
:ok
iex(6)> import Poison
** (CompileError) iex:6: module Poison is not loaded and could not be found

另外,如何从 github 全局安装库?

不是直接的答案,而是另一种可能实现您想要的方式:

您可以有一个您生成一次的游乐场项目(例如mix new playground ),然后您可以相对轻松地添加新的依赖项。

如果您在该项目中执行iex -S mix ,您将获得其所有依赖项。

如果您想在稍后的某个时间点快速尝试例如Poison ,您可以回到这个项目。

第一步:你想要什么?

我想在没有 Mix 项目的情况下使用多个库,例如

  • 结合
  • CSV

从 Github 获取他们的源代码,git checkout 到最后一个版本并编译它们。

第二步:你想要它们在哪里?

编译完成后,创建 ~/.mix/beam/ 并将 .beam 文件移动到此目录中。

第三步:自定义您的 IEx

值得庆幸的是, iex只是一个 shell 脚本。 如果您碰巧有一个指向 ~/.local/bin 的自定义$PATH变量,则将 iex 复制到此目录并将其重命名为deviex之类的名称。 然后在您的自定义deviex中,移动到最后一行并将其更改为...

exec elixir --no-halt --erl "-user Elixir.IEx.CLI" -pa "$HOME/.mix/beam" +iex "$@"

现在它将在启动时加载位于 ~/.mix/beam 的 .beam 文件。

我们为 IEx 使用不同脚本的原因是为了避免与您将使用常规iex处理的项目中已安装的库发生名称冲突。

我不知道是否有官方的方法可以做到这一点。

一种方法是在本地克隆库项目,编译它,然后通过创建~/.iex.exs脚本将其添加到库路径中:

IO.puts "Adding poison to path from ~/.iex.exs"
true = Code.prepend_path("#{path_to_project}"/poison/_build/dev/lib/poison/ebin")

您可以使用 Elixir 1.12 中引入的Mix.install 它适用于任何目录,不需要 Mix 项目。

iex(1)> Mix.install [:poison]
:ok
iex(2)> import Poison
Poison

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM