elixir - que - seleccion por deps
¿Cómo puedo cargar una biblioteca de Elixir en iex sin agregarla a los deps de mix.exs de un proyecto? (3)
No es una respuesta directa, sino otra forma de lograr lo que quieres:
Podría tener un proyecto de área de juegos de juegos que genere una vez (por ejemplo, mix new playground
) y que pueda agregar nuevas dependencias de manera relativamente fácil.
Si iex -S mix
dentro de este proyecto, obtendrá todas sus dependencias.
Si desea experimentar rápidamente con, por ejemplo, Poison
en algún momento posterior, puede volver a este proyecto.
Quiero probar el módulo Poison json sin crear un proyecto mixto.
¿Cómo lo instalo y lo hago disponible en iex a través de la importación?
He podido agregarlo a un proyecto, luego usarlo después de ingresar al directorio del proyecto y usar 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)>
Sin embargo, si entro en un iex normal en un directorio genérico, parece que no puedo acceder a la biblioteca de 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
Además, ¿cómo instalo una biblioteca globalmente desde github?
No sé si hay una forma oficial de hacer esto.
Una forma sería clonar el proyecto de la biblioteca localmente, compilarlo y luego agregarlo a la ruta de la biblioteca así creando un script ~/.iex.exs
:
IO.puts "Adding poison to path from ~/.iex.exs"
true = Code.prepend_path("#{path_to_project}"/poison/_build/dev/lib/poison/ebin")
Te puedo recomendar este blog .
Paso 1: ¿Qué quieres?
Hay más de un par de bibliotecas que quiero usar sin un proyecto Mix, como
- Combinar
- CSV
- Veneno
Obtenga sus fuentes de Github, git checkout hasta la última versión y compílelas.
Segundo paso: ¿Dónde los quieres?
Una vez finalizada la compilación, cree ~ / .mix / beam / y mueva los archivos .beam a este directorio.
3er paso: ¡Ahora personalicemos tu shell interactivo de EliXir!
Afortunadamente, iex es solo un script de shell. Si tiene una variable $ PATH personalizada que apunta a ~ / .local / bin, copie iex a este directorio y cambie su nombre por algo como deviex. Luego, en su deviex personalizado, vaya a la última línea y cámbielo a ...
exec elixir --no-halt --erl "-user Elixir.IEx.CLI" -pa "$HOME/.mix/beam" +iex "$@"
Y ahora cargará los archivos .beam ubicados en ~ / .mix / beam en el inicio.
La razón por la que usamos un script diferente para IEx es para evitar conflictos de nombres con las bibliotecas instaladas en los proyectos en los que trabajará con iex regular.