Dialyzer is broken on certifi, plug

certifi is an Erlang package with a portable TLS trust root. It’s pulled in if you use Plug. This is its rebar.config:

{erl_opts, [no_debug_info]}.
{deps, []}.

Notice that the no_debug_info line is not conditional. Dialyzer chokes on any BEAM files without it, and will not process the library itself or any of its dependents into PLT files.

This causes errors like this:

:0: Unknown function 'Elixir.HTTPoison':request/5
:0: Unknown function 'Elixir.OAuth2.AccessToken':new/1
:0: Unknown function 'Elixir.OAuth2.Client':'authorize_url!'/2
:0: Unknown function 'Elixir.OAuth2.Client':'get!'/2
:0: Unknown function 'Elixir.OAuth2.Client':'get_token!'/2
:0: Unknown function 'Elixir.OAuth2.Client':new/1
:0: Unknown function 'Elixir.OAuth2.Client':put_header/3
:0: Unknown function 'Elixir.OAuth2.Strategy.AuthCode':authorize_url/2
:0: Unknown function 'Elixir.OAuth2.Strategy.AuthCode':get_token/3
:0: Unknown function 'Elixir.Plug.Adapters.Cowboy':http/3
:0: Unknown function 'Elixir.Plug.Conn':chunk/2
:0: Unknown function 'Elixir.Plug.Conn':fetch_query_params/1
:0: Unknown function 'Elixir.Plug.Conn':put_private/3
:0: Unknown function 'Elixir.Plug.Conn':put_resp_header/3
:0: Unknown function 'Elixir.Plug.Conn':read_body/1
:0: Unknown function 'Elixir.Plug.Conn':send_chunked/2
:0: Unknown function 'Elixir.Plug.Conn':send_resp/3
:0: Unknown function 'Elixir.Plug.Router.Utils':forward/4
:0: Unknown function 'Elixir.PlugBasicAuth':call/2
:0: Unknown type 'Elixir.OAuth2.Client':t/0

To fix this (temporarily), you can put this into your mix.exs file, or wait until upstream fixes it:

defp deps, do: [
  {:certifi, git: "https://github.com/bors-ng/erlang-certifi.git", override: true},
]
1 Like