dwyl / phoenix-liveview-counter-tutorial

🤯 beginners tutorial building a real time counter in Phoenix 1.7.14 + LiveView 1.0 ⚡️ Learn the fundamentals from first principals so you can make something amazing! 🚀
https://livecount.fly.dev/
GNU General Public License v2.0
374 stars 36 forks source link

mix: FunctionClauseError: no function clause matching in String.to_charlist/1 #114

Closed milahu closed 1 year ago

milahu commented 1 year ago

mix fails to install tailwindcss and esbuild with empty proxy environment variables on nixos linux

workaround: unset http_proxy https_proxy sock_proxy

since im a complete noob in elixir, who is to blame here? mix?

nix-shell -p elixir_1_14 inotify-tools
elixir -v 
# Erlang/OTP 24 [erts-12.3.2.5] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit]
# Elixir 1.14.1 (compiled with Erlang/OTP 24)
mix local.hex
mix archive.install hex phx_new
mix phx.new -v
# Phoenix installer v1.6.15
git clone https://github.com/dwyl/phoenix-liveview-counter-tutorial --depth 1
cd phoenix-liveview-counter-tutorial
mix setup
mix phx.server

[info] Running LiveViewCounterWeb.Endpoint with cowboy 2.9.0 at 127.0.0.1:4000 (http)
[debug] Downloading tailwind from https://github.com/tailwindlabs/tailwindcss/releases/download/v3.1.8/tailwindcss-linux-x64
[debug] Using HTTP_PROXY: 
[debug] Downloading esbuild from https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.41.tgz
[debug] Using HTTP_PROXY: 
[info] Access LiveViewCounterWeb.Endpoint at http://localhost:4000
[error] Task #PID<0.494.0> started from LiveViewCounterWeb.Endpoint terminating
** (FunctionClauseError) no function clause matching in String.to_charlist/1
    (elixir 1.14.1) String.to_charlist(nil)
    (tailwind 0.1.9) lib/tailwind.ex:298: Tailwind.fetch_body!/1
    (tailwind 0.1.9) lib/tailwind.ex:230: Tailwind.install/0
    (tailwind 0.1.9) lib/tailwind.ex:215: Tailwind.install_and_run/2
    (phoenix 1.7.0-rc.1) lib/phoenix/endpoint/watcher.ex:19: Phoenix.Endpoint.Watcher.watch/2
    (elixir 1.14.1) lib/task/supervised.ex:89: Task.Supervised.invoke_mfa/2
    (stdlib 3.17.2.1) proc_lib.erl:226: :proc_lib.init_p_do_apply/3
Function: &Phoenix.Endpoint.Watcher.watch/2
    Args: ["tailwind", {Tailwind, :install_and_run, [:default, ["--watch"]]}]
[error] Task #PID<0.493.0> started from LiveViewCounterWeb.Endpoint terminating
** (FunctionClauseError) no function clause matching in String.to_charlist/1
    (elixir 1.14.1) String.to_charlist(nil)
    (esbuild 0.6.0) lib/esbuild.ex:353: Esbuild.httpc_proxy/1
    (esbuild 0.6.0) lib/esbuild.ex:312: Esbuild.fetch_body!/1
    (esbuild 0.6.0) lib/esbuild.ex:217: Esbuild.install/0
    (esbuild 0.6.0) lib/esbuild.ex:189: Esbuild.install_and_run/2
    (phoenix 1.7.0-rc.1) lib/phoenix/endpoint/watcher.ex:19: Phoenix.Endpoint.Watcher.watch/2
    (elixir 1.14.1) lib/task/supervised.ex:89: Task.Supervised.invoke_mfa/2
    (stdlib 3.17.2.1) proc_lib.erl:226: :proc_lib.init_p_do_apply/3
Function: &Phoenix.Endpoint.Watcher.watch/2
    Args: ["esbuild", {Esbuild, :install_and_run, [:default, ["--sourcemap=inline", "--watch"]]}]
[debug] Downloading tailwind from https://github.com/tailwindlabs/tailwindcss/releases/download/v3.1.8/tailwindcss-linux-x64
[debug] Using HTTP_PROXY: 
[debug] Downloading esbuild from https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.41.tgz
[debug] Using HTTP_PROXY: 
[error] Task #PID<0.495.0> started from LiveViewCounterWeb.Endpoint terminating
** (FunctionClauseError) no function clause matching in String.to_charlist/1
    (elixir 1.14.1) String.to_charlist(nil)
    (tailwind 0.1.9) lib/tailwind.ex:298: Tailwind.fetch_body!/1
    (tailwind 0.1.9) lib/tailwind.ex:230: Tailwind.install/0
    (tailwind 0.1.9) lib/tailwind.ex:215: Tailwind.install_and_run/2
    (phoenix 1.7.0-rc.1) lib/phoenix/endpoint/watcher.ex:19: Phoenix.Endpoint.Watcher.watch/2
    (elixir 1.14.1) lib/task/supervised.ex:89: Task.Supervised.invoke_mfa/2
    (stdlib 3.17.2.1) proc_lib.erl:226: :proc_lib.init_p_do_apply/3
Function: &Phoenix.Endpoint.Watcher.watch/2
    Args: ["tailwind", {Tailwind, :install_and_run, [:default, ["--watch"]]}]
[error] Task #PID<0.496.0> started from LiveViewCounterWeb.Endpoint terminating
** (FunctionClauseError) no function clause matching in String.to_charlist/1
    (elixir 1.14.1) String.to_charlist(nil)
    (esbuild 0.6.0) lib/esbuild.ex:353: Esbuild.httpc_proxy/1
    (esbuild 0.6.0) lib/esbuild.ex:312: Esbuild.fetch_body!/1
    (esbuild 0.6.0) lib/esbuild.ex:217: Esbuild.install/0
    (esbuild 0.6.0) lib/esbuild.ex:189: Esbuild.install_and_run/2
    (phoenix 1.7.0-rc.1) lib/phoenix/endpoint/watcher.ex:19: Phoenix.Endpoint.Watcher.watch/2
    (elixir 1.14.1) lib/task/supervised.ex:89: Task.Supervised.invoke_mfa/2
    (stdlib 3.17.2.1) proc_lib.erl:226: :proc_lib.init_p_do_apply/3
Function: &Phoenix.Endpoint.Watcher.watch/2
    Args: ["esbuild", {Esbuild, :install_and_run, [:default, ["--sourcemap=inline", "--watch"]]}]
[info] Running LiveViewCounterWeb.Endpoint with cowboy 2.9.0 at 127.0.0.1:4000 (http)
[info] Access LiveViewCounterWeb.Endpoint at http://localhost:4000
[debug] Downloading tailwind from https://github.com/tailwindlabs/tailwindcss/releases/download/v3.1.8/tailwindcss-linux-x64
[debug] Downloading esbuild from https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.41.tgz
[debug] Using HTTP_PROXY: 
[debug] Using HTTP_PROXY: 

lib/esbuild.ex:353

  defp httpc_proxy(proxy) do
    %{host: host, userinfo: userinfo, port: port} = URI.parse(proxy)
    authority = if userinfo, do: "#{userinfo}@#{host}", else: host
    {{String.to_charlist(authority), port}, []} # lib/esbuild.ex:353
  end

lib/tailwind.ex:298

  defp fetch_body!(url) do
    url = String.to_charlist(url)
    Logger.debug("Downloading tailwind from #{url}")

    {:ok, _} = Application.ensure_all_started(:inets)
    {:ok, _} = Application.ensure_all_started(:ssl)

    if proxy = System.get_env("HTTP_PROXY") || System.get_env("http_proxy") do
      Logger.debug("Using HTTP_PROXY: #{proxy}")
      %{host: host, port: port} = URI.parse(proxy)
      :httpc.set_options([{:proxy, {{String.to_charlist(host), port}, []}}]) # lib/tailwind.ex:298
    end

System.get_env("http_proxy") is empty string, but truthy

env | grep -i proxy

https_proxy=
sock_proxy=
http_proxy=

workaround

unset http_proxy https_proxy sock_proxy
env | grep -i proxy | wc -l

0
mix phx.server

[info] Running LiveViewCounterWeb.Endpoint with cowboy 2.9.0 at 127.0.0.1:4000 (http)
[debug] Downloading tailwind from https://github.com/tailwindlabs/tailwindcss/releases/download/v3.1.8/tailwindcss-linux-x64
[debug] Downloading esbuild from https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.41.tgz
[info] Access LiveViewCounterWeb.Endpoint at http://localhost:4000
[watch] build finished, watching for changes...
nelsonic commented 1 year ago

Hey @milahu welcome to @dwyl! 👋 Hmm ... this question might get a faster answer if you open it either on https://github.com/phoenixframework/phoenix or https://elixirforum.com as we don't use nixos linux so are unlikely to be able to help debug it. 💭

milahu commented 1 year ago

we don't use nixos linux

sorry, that was misleading

to reproduce, set empty proxy env-vars

export http_proxy= https_proxy= sock_proxy=
nelsonic commented 1 year ago

Hmm ... very curious why this would fail. 💭 As José says, not something they're going to change/fix: https://github.com/phoenixframework/esbuild/issues/56#issuecomment-376947234 🤷‍♂️

milahu commented 1 year ago

yes .. closing: my bad, has workaround