web-dev-qa-db-fra.com

Comment charger une bibliothèque Elixir dans iex sans l'ajouter aux dépôts mix.exs d'un projet?

Je veux essayer le module Poison json sans créer de projet de mixage.

Comment l'installer et le rendre disponible dans iex via l'importation?

J'ai pu l'ajouter à un projet, puis l'utiliser après être entré dans le répertoire du projet et avoir utilisé 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)>

Cependant, si je vais juste dans un iex normal dans un répertoire générique, je n'arrive pas à accéder à la bibliothèque 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

Aussi, comment installer une bibliothèque globalement à partir de github?

20
Thomas Browne

Je peux vous recommander ceci article de blog .


1ère étape: que voulez-vous?

Il y a plus d'un couple de bibliothèques que je veux utiliser sans projet Mix, comme

  • Combiner
  • CSV
  • Poison

Obtenez leurs sources depuis Github, git checkout jusqu'à la dernière version et compilez-les.

2e étape: où les voulez-vous?

Une compilation était terminée, créez ~/.mix/beam/et déplacez les fichiers .beam dans ce répertoire.

3e étape: personnalisons maintenant votre coque EliXir interactive!

Heureusement, iex n'est qu'un script Shell. S'il vous arrive d'avoir une variable $ PATH personnalisée qui pointe vers ~/.local/bin, copiez iex dans ce répertoire et renommez-la en quelque chose comme deviex. Ensuite, dans votre deviex personnalisé, passez à la dernière ligne et changez-le en…

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

Et maintenant, il chargera les fichiers .beam situés dans ~/.mix/beam au démarrage.

La raison pour laquelle nous utilisons un script différent pour IEx est d'éviter les conflits de noms avec les bibliothèques installées dans les projets sur lesquels vous travaillerez avec iex standard.

7
Uniaika

Pas une réponse directe, mais une autre façon de réaliser peut-être ce que vous voulez:

Vous pouvez avoir un projet de terrain de jeu que vous générez une fois (par exemple mix new playground) et auquel vous pouvez ensuite ajouter relativement facilement de nouvelles dépendances.

Si tu fais iex -S mix dans ce projet, vous obtiendrez toutes ses dépendances.

Si vous voulez expérimenter rapidement avec par exemple Poison à un moment ultérieur, vous pouvez simplement revenir dans ce projet.

30
Henrik N

Je ne sais pas s'il existe une manière officielle de procéder.

Une façon serait de cloner le projet de bibliothèque localement, de le compiler, puis de l'ajouter au chemin de la bibliothèque comme ceci en créant un ~/.iex.exs script:

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