W dużym uproszczeniu Hex jest managerem pakietów w Elixirze. Dokładniej pełni on rolę narzędzia do zarządzania pakietami, zależnościami oraz jest też repozytorium zależności. Coś jak Ivy dla Anta z konfiguracją do repozytorium Mavena. Rzecz w tym, że dziś rzeźbiąc sobie kod otrzymałem błąd:

Listing 1. Błędny błąd

[koziolek@koziolek-laptop learn_elixir (master)]$ mix test
** (UndefinedFunctionError) function Hex.SCM.managers/1 is undefined or private
    Hex.SCM.managers([lock: nil, env: :prod, hex: :exml, build: "/home/koziolek/workspace/learn_elixir/_build/test/lib/exml", dest: "/home/koziolek/workspace/learn_elixir/deps/exml"])
    (mix) lib/mix/dep/loader.ex:173: Mix.Dep.Loader.scm_manager/2
    (mix) lib/mix/dep/loader.ex:44: Mix.Dep.Loader.load/2
    (mix) lib/mix/dep/converger.ex:179: Mix.Dep.Converger.all/9
    (mix) lib/mix/dep/converger.ex:114: Mix.Dep.Converger.all/7
    (mix) lib/mix/dep/converger.ex:99: Mix.Dep.Converger.all/4
    (mix) lib/mix/dep/converger.ex:50: Mix.Dep.Converger.converge/4
    (mix) lib/mix/dep.ex:95: Mix.Dep.loaded/1

Szybkie sprawdzenie mix.exs niby wszystko ok, ale dla pewności dociągnę zależności:

Listing 2. Błędny błąd – bardziej gadatliwy

[koziolek@koziolek-laptop learn_elixir (master)]$ mix deps.get
A new Hex version is available (v0.13.2), please update with `mix local.hex`
Running dependency resolution
** (UndefinedFunctionError) function Access.Map.get_and_update!/3 is undefined (module Access.Map is not available)
    Access.Map.get_and_update!(%Mix.Dep{app: :exml, deps: [], extra: [], from: "/home/koziolek/workspace/learn_elixir/mix.exs", manager: nil, opts: [env: :prod, hex: :exml, build: "/home/koziolek/workspace/learn_elixir/_build/dev/lib/exml", dest: "/home/koziolek/workspace/learn_elixir/deps/exml"], requirement: "~> 0.1.0", scm: Hex.SCM, status: {:unavailable, "/home/koziolek/workspace/learn_elixir/deps/exml"}, top_level: true}, :deps, #Function)
    lib/hex/resolver.ex:190: Hex.Resolver.attach_dep_and_children/3
    lib/hex/resolver.ex:150: Hex.Resolver.get_deps/4
    lib/hex/resolver.ex:109: Hex.Resolver.activate/5
    lib/hex/resolver.ex:31: Hex.Resolver.resolve/3
    lib/hex/remote_converger.ex:33: Hex.RemoteConverger.converge/2
    (mix) lib/mix/dep/converger.ex:89: Mix.Dep.Converger.all/4
    (mix) lib/mix/dep/converger.ex:50: Mix.Dep.Converger.converge/4

Czyli ok… rzeczywiście robiłem ostatnio update Elixira i trzeba by podbić wersję Hexa! Zatem lecimy z tematem:

Listing 3. Błędny błąd – brak zmian

[koziolek@koziolek-laptop learn_elixir (master)]$ mix local.hex
Are you sure you want to install archive "https://repo.hex.pm/installs/1.3.0/hex-0.13.2.ez"? [Yn] Y
* creating /home/koziolek/.mix/archives/hex-0.13.2
[koziolek@koziolek-laptop learn_elixir (master)]$ mix deps.get
A new Hex version is available (v0.13.2), please update with `mix local.hex`
Running dependency resolution
** (UndefinedFunctionError) function Access.Map.get_and_update!/3 is undefined (module Access.Map is not available)
    Access.Map.get_and_update!(%Mix.Dep{app: :exml, deps: [], extra: [], from: "/home/koziolek/workspace/learn_elixir/mix.exs", manager: nil, opts: [env: :prod, hex: :exml, build: "/home/koziolek/workspace/learn_elixir/_build/dev/lib/exml", dest: "/home/koziolek/workspace/learn_elixir/deps/exml"], requirement: "~> 0.1.0", scm: Hex.SCM, status: {:unavailable, "/home/koziolek/workspace/learn_elixir/deps/exml"}, top_level: true}, :deps, #Function)
    lib/hex/resolver.ex:190: Hex.Resolver.attach_dep_and_children/3
    lib/hex/resolver.ex:150: Hex.Resolver.get_deps/4
    lib/hex/resolver.ex:109: Hex.Resolver.activate/5
    lib/hex/resolver.ex:31: Hex.Resolver.resolve/3
    lib/hex/remote_converger.ex:33: Hex.RemoteConverger.converge/2
    (mix) lib/mix/dep/converger.ex:89: Mix.Dep.Converger.all/4
    (mix) lib/mix/dep/converger.ex:50: Mix.Dep.Converger.converge/4

No i chuj… Mniej więcej tak to wyglądało:

Życie...

Wychodzi na to, że Hex się jednak nie zaktualizował i nadal wisi w jakiejś przedpotopowej wersji. Nauczony doświadczeniem z Eclipse+Maven wybrałem się do katalogu z repozytorium mixa, czyli ~/.mix/archives/ i wywaliłem wszystko co związane z Hexem, czyli plik hex.ez i katalog hex-0.13.2. Po czym wróciłem do katalogu z projektem i powtórzyłem instalację hexa i ściągnięcie zależności.

Co się okazało?

Ano okazało się, że aktualizacja Hexa nie podmienia pliku hex.ez

Listing 4. Błędny błąd – przyczyna, zwróć uwagę na daty

[koziolek@koziolek-laptop archives]$ ll
razem 392
drwxrwxr-x 3 koziolek koziolek   4096 paź 24 21:07 ./
drwxrwxr-x 3 koziolek koziolek   4096 maj 23  2015 ../
drwxrwxr-x 3 koziolek koziolek   4096 paź 24 21:07 hex-0.13.2/
-rw-rw-r-- 1 koziolek koziolek 262010 maj 19  2015 hex.ez
-rw-rw-r-- 1 koziolek koziolek 123280 maj 23  2015 phoenix_new-0.13.1.ez

Ręczne usunięcie tego pliku wymusza jego ponowne pobranie, już w aktualnej wersji.