chocolatedonut
:appsignal_plug, a dependency of :appsignal_phoenix, fails on this line, with an error Plug.Conn.__struct__/0 is undefined.
Any idea on what might be causing this, and how to fix it, appreciated. ![]()
What I’ve tried so far:
rm -rf _build depsmv ~/.hex/cache.ets ~/.hex/cache.ets.bak- locally cloned and successfully compiled
:appsignal_plug({:appsignal_plug, path: "/appsignal-elixir-plug", override: true}) - removed
:appsignal_*deps, but now:banditreports same error (module Plug.Conn is not loaded and could not be found).
Full error from mix deps.compile output:
==> appsignal
AppSignal extension installation successful
Compiling 54 files (.ex)
Generated appsignal app
==> appsignal_plug
Compiling 2 files (.ex)
error: Plug.Conn.__struct__/0 is undefined, cannot expand struct Plug.Conn. Make sure the struct name is correct. If the struct name exists and is correct but it still cannot be found, you likely have cyclic module usage in your code
│
100 │ def put_name(%Plug.Conn{} = conn, name) do
│ ^
│
└─ lib/appsignal_plug.ex:100:16: Appsignal.Plug.put_name/2
error: Plug.Conn.__struct__/0 is undefined, cannot expand struct Plug.Conn. Make sure the struct name is correct. If the struct name exists and is correct but it still cannot be found, you likely have cyclic module usage in your code
│
3 │ %Plug.Conn{
│ ^
│
└─ lib/appsignal_plug/metadata.ex:3:9: Appsignal.Metadata.Plug.Conn.metadata/1
== Compilation error in file lib/appsignal_plug.ex ==
** (CompileError) lib/appsignal_plug.ex: cannot compile module Appsignal.Plug (errors have been logged)
lib/appsignal_plug.ex:100: (module)
could not compile dependency :appsignal_plug, "mix compile" failed. Errors may have been logged above. You can recompile this dependency with "mix deps.compile appsignal_plug --force", update it with "mix deps.update appsignal_plug" or clean it with "mix deps.clean appsignal_plug"
Odd things noticed:
- the above error occurs even when referring to a locally-cloned
:appsignal_plug({:appsignal_plug, path: "/appsignal-elixir-plug"}) … even though that locally-cloned repo compiles! :appsignal_plugcompiles in another, older instance of my application, on the same server. The problematic application’smix.lockis identical to the older one’s, regarding the 3 AppSignal libs. Bothmix.locks have this:
"appsignal": {:hex, :appsignal, "2.12.2", "f93bed975c73779e1711fb2196b4c340c50b474ab41a7026e8599b0b4b5db046", [:make, :mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:decorator, "~> 1.2.3 or ~> 1.3", [hex: :decorator, repo: "hexpm", optional: false]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c4063fcd264a5e372299bec15bbf35a057ae5912c739d374616e0a33c0cc9ef0"},
"appsignal_phoenix": {:hex, :appsignal_phoenix, "2.4.0", "150cf8753e3f0a6352504886808c822a4b8099afdfb4b8ff98cbd8d49c99663d", [:mix], [{:appsignal, ">= 2.11.0 and < 3.0.0", [hex: :appsignal, repo: "hexpm", optional: false]}, {:appsignal_plug, ">= 2.0.15 and < 3.0.0", [hex: :appsignal_plug, repo: "hexpm", optional: false]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.11 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_live_view, "~> 0.9 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "2808cbf12c0ab16ae909ccbae1af758d7478e6165a4324277f701bafbcf70aa1"},
"appsignal_plug": {:hex, :appsignal_plug, "2.0.15", "758a8a78944878e8461bbc77ca86219121a56f4299c6d79940ab083cf9afea00", [:mix], [{:appsignal, ">= 2.7.6 and < 3.0.0", [hex: :appsignal, repo: "hexpm", optional: false]}, {:plug, ">= 1.1.0", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "1c6059049e2081e808aaef04e2b9917e06277f61a35a0e103db860d08cbc41f1"}
- I checked the 2
myappversions for any difference inPlugusage, butgrep Plug /myapp{newer,older}/lib/**/*.exoutput is identical.
Env
Elixir 1.17.1
Erlang 27.0
Ubuntu 20.04.6
Trending in Questions
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
Hello,
I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind.
However, when I launch mix phx.server, I get an error...
New
Hi everyone.
My team and I have been working on a fairly modest app based around video streaming and chat, but we’ve landed a customer t...
New
I really like the adapter patterns that ecto, nebulex, waffle, etc. use and would love find something similar for a key management servic...
New
Hello folks!
So at work, we are seeing some situations where we have to define some “fixed” strings that are used across the codebase in...
New
I’m working on a small exercise involving update_in/3, and I came up with this solution:
data = %{
name: "Periodic Table",
category:...
New
How Can I Optimise Compile Time Dependencies
I have been building an elixir application for about 2 years now. Many modules and files ha...
New
Other Trending Topics
Edit: 2026 May 15 - This post is archived.
Mob is alive!!
Main docs: mob v0.7.11 — Documentation
A bit of explanation for the slightly c...
New
A little off-topic, but I feel like people here have a good head on their shoulders.
I used to be quite good at making software. Was luc...
New
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #ai
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #blog-post
- #elixirconf-us
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #elixirconf-eu
- #api
- #forms
- #security
- #metaprogramming











Showing Posts 1 to 2- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
hubertlepicki
Can you try:
This should force recompilation of all the dependencies.
If this doesn’t work, can you try removing the
_buildfolder completely and trying again?chocolatedonut
Thanks. I already tried both. (Even though the
rmcmd in OP had incorrect/reversed dir names – it should berm -rf _build deps– I did dormagainst correct dirs.)I now realised that mix.exs still had a :plug reference to a
:pathfrom a local computer, but which doesn’t exist on the server:Removing the above fixed the issue.
But can you advise how to avoid such issue in the future? Why did…
mix deps.get --only prodmix deps.compile…keep “silently” failing? “silently” as in not pointing to the actual cause of the issue (if this was indeed the “root” cause).
mix deps.getwithout the--only prodflag does warn that the above:plug:pathdoesn’t exist.In
mix.lockall:plugreferences seemed to be referring to"hexpm", even with the above{:plug, ..., only: :dev}. F.e. ref for"phoenix"in mix.lock:If it matters,
MIX_ENVwas set toprodthroughout.What could I’ve done better?