Mix commands give "Error opening ETS file"

When i run mix deps.get in a newly created app I get the errors shown below. When I run mix hex.info I get the same errors after the info:

C:\Dev\Test\elixir_scenic\scenic-master\scenic_example>mix hex.info
Hex:    0.19.0
Elixir: 1.8.1
OTP:    21.3

Built with: Elixir 1.8.0 and OTP 20.2
Error opening ETS file h:/.hex/cache.ets: {:read_error, {:file_error, 'h:/.hex/cache.ets', :eio}}
....

I am on Windows 10. I also tried running the mix command as Administrator: same problem. Here is the full error log:

Error opening ETS file h:/.hex/cache.ets: {:read_error, {:file_error, 'h:/.hex/cache.ets', :eio}}
Resolving Hex dependencies...
Dependency resolution completed:
New:
[32m  elixir_make 0.5.2[0m
[32m  font_metrics 0.3.1[0m
[32m  msgpax 2.2.3[0m
[32m  scenic 0.10.2[0m
[32m  scenic_clock 0.10.0[0m
[32m  scenic_driver_glfw 0.10.0[0m
[32m  scenic_sensor 0.7.0[0m
* Getting scenic (Hex package)
* Getting scenic_driver_glfw (Hex package)
* Getting scenic_sensor (Hex package)
* Getting scenic_clock (Hex package)
* Getting elixir_make (Hex package)
* Getting font_metrics (Hex package)
* Getting msgpax (Hex package)

20:41:46.292 [error] GenServer Hex.Registry.Server terminating
** (MatchError) no match of right hand side value: {:error, :eaccess}
    (hex) lib/hex/registry/server.ex:273: Hex.Registry.Server.persist/2
    (hex) lib/hex/registry/server.ex:142: anonymous fn/3 in Hex.Registry.Server.handle_call/3
    (hex) lib/hex/registry/server.ex:436: Hex.Registry.Server.wait_closing/2
    (hex) lib/hex/registry/server.ex:140: Hex.Registry.Server.handle_call/3
    (stdlib) gen_server.erl:661: :gen_server.try_handle_call/4
    (stdlib) gen_server.erl:690: :gen_server.handle_msg/6
    (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
Last message (from #PID<0.91.0>): :close
State: %{closing_fun: nil, ets: #Reference<0.3859258191.2784886792.168350>, fetched: #MapSet<[{"hexpm", "elixir_make"}, {"hexpm", "font_metrics"}, {"hexpm", "msgpax"}, {"hexpm", "plug"}, {"hexpm", "scenic"}, {"hexpm", "scenic_clock"}, {"hexpm", "scenic_driver_glfw"}, {"hexpm", "scenic_sensor"}]>, path: "h:/.hex/cache.ets", pending: #MapSet<[]>, waiting: %{}}
Client #PID<0.91.0> is alive

    (stdlib) gen.erl:169: :gen.do_call/4
    (elixir) lib/gen_server.ex:986: GenServer.call/3
    (hex) lib/hex/registry/server.ex:37: Hex.Registry.Server.close/0
    (mix) lib/mix/dep/converger.ex:52: Mix.Dep.Converger.converge/4
    (mix) lib/mix/dep/fetcher.ex:16: Mix.Dep.Fetcher.all/3
    (mix) lib/mix/tasks/deps.get.ex:31: Mix.Tasks.Deps.Get.run/1
    (mix) lib/mix/task.ex:331: Mix.Task.run_task/3
    (mix) lib/mix/cli.ex:79: Mix.CLI.run_task/2
** (ArgumentError) raise/1 and reraise/2 expect a module name, string or exception as the first argument, got: {:badmatch, {:error, :eaccess}}
    (hex) lib/hex/registry/server.ex:273: Hex.Registry.Server.persist/2
    (hex) lib/hex/registry/server.ex:142: anonymous fn/3 in Hex.Registry.Server.handle_call/3
    (hex) lib/hex/registry/server.ex:436: Hex.Registry.Server.wait_closing/2
    (hex) lib/hex/registry/server.ex:140: Hex.Registry.Server.handle_call/3
    (stdlib) gen_server.erl:661: :gen_server.try_handle_call/4
    (stdlib) gen_server.erl:690: :gen_server.handle_msg/6
    (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3

Hi coproc,

Hex is trying to access its home directory on the h:/ drive. This is probably because you have set your user account home directory to h:/ or have configured a custom directory for Hex.

Is the h:/ drive available and writeable? If not you can change the home directory by setting the HEX_HOME environment variable.

1 Like

yes, that was the problem: outside my company’s network the home drive H: is not writeable.
Moving .hex from H: to another drive and setting HEX_HOME accordingly solved this issue.
Thanks!
(I was also confused by the lower case spelling h:… thinking that this is elixir/erlang code …)

1 Like