Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

elixir

I want to tryout the Poison json module without creating a mix project.

How do I install it and make it available in iex via import?

I have been able to add it to a project, then use it after going into the project directory and using 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)> 

However if I just go into a normal iex in a generic directory then I can't seem to access the Poison library:

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 

Also, how do I install a library globally from github?

like image 642
Thomas Browne Avatar asked Mar 17 '16 16:03

Thomas Browne


People also ask

What does mix DEPS get do?

get (Mix v1. 12.3) Gets all out of date dependencies, i.e. dependencies that are not available or have an invalid lock.

How does elixir from mixture?

In an elixir, the active ingredients are mixed with a liquid, usually a kind of syrup or alcohol, in which they can dissolve. In a suspension, the medicine is mixed with a liquid, usually water, in which it cannot dissolve and therefore remains intact in the form of small particles.

How do you compile an elixir file?

You can compile an elixir file using the elixirc command. This will create a . beam file in the current directory for each module defined in your file. If you start iex in this directory your modules from the file will be available.


2 Answers

Not a direct answer, but another way to maybe achieve what you want:

You could have a playground project that you generate once (e.g. mix new playground) and that you can then relatively easily add new dependencies to.

If you do iex -S mix within this project, you'll get all its dependencies.

If you want to quickly experiment with e.g. Poison at some later point in time, you can just go back into this project.

like image 127
Henrik N Avatar answered Oct 25 '22 19:10

Henrik N


1st Step: What do you want?

There's more than a couple of libraries I want to use without a Mix project, like

  • Combine
  • CSV
  • Poison

Get their sources from Github, git checkout to the last release and compile them.

2nd Step: Where do you want them?

Once compilation is over, create ~/.mix/beam/ and move the .beam files into this directory.

3rd Step: Customize your IEx

Thankfully, iex is just a shell script. If you happen to have a custom $PATH variable that points to ~/.local/bin, then copy iex to this directory and rename it to something like deviex. Then in your custom deviex, move to the last line and change it to…

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

And now it will load the .beam files located at ~/.mix/beam at startup.

The reason why we use a different script for IEx is to avoid name conflicts with installed libs in the projects you'll work on with regular iex.

like image 20
Hécate Avatar answered Oct 25 '22 18:10

Hécate