odohMei7

odohMei7

I am new to phoenix and want to use it with gun to subscribe to websockets. But when I try this in a phoenix project, I get a dependency error. As a minimal example do the following:

$ mix phx.new --version
Phoenix v1.5.3
$ mix phx.new test --no-ecto
[...]

Then I add gun to the dependencies:

  defp deps do
    [
      {:phoenix, "~> 1.5.3"},
      {:phoenix_html, "~> 2.11"},
      {:phoenix_live_reload, "~> 1.2", only: :dev},
      {:phoenix_live_dashboard, "~> 0.2.0"},
      {:telemetry_metrics, "~> 0.4"},
      {:telemetry_poller, "~> 0.4"},
      {:gettext, "~> 0.11"},
      {:jason, "~> 1.0"},
      {:plug_cowboy, "~> 2.0"},
      {:gun, "~> 1.3.2"},
    ]
  end

But when I do mix deps.get I get the following error:

Resolving Hex dependencies...

Failed to use "cowlib" because
  gun (version 1.3.2) requires ~> 2.6.0
  mix.lock specifies 2.9.1

** (Mix) Hex dependency resolution failed, change the version requirements of your dependencies or unlock them (by using mix deps.update or mix deps.unlock). If you are unable to resolve the conflicts you can try overriding with {:dependency, "~> 1.0", override: true}

What should I do? Thanks in advance.

Showing Posts 1 to 10

LostKobrakai

LostKobrakai

You can probably unlock cowlib and do a mix deps.get again and it should resolve. Unless you really have some code depending on cowlib > 2.6.

odohMei7

odohMei7 OP

Thank you but how exactly can I unlock something? I have never done that before.

And is this a bug? Or how would you use pheonix with gun?

LostKobrakai

LostKobrakai

This is not a bug. You installed phoenix, which then fetched the latest version of cowlib and locks the version in mix.lock (this happens for all your dependencies). gun however needs an earlier version of cowlib. You’re however unlikely to be using cowlib directly (transitive dependency) and it seems non of your direct dependencies actually conflicts with the version constraint of gun, so you should be able to safely do mix deps.unlock cowlib, mix deps.get. This will remove the lock on the currently installed version of cowlib and allow mix to resolve the selected version under those new constraints with gun.

odohMei7

odohMei7 OP

OK thanks for the explanation. But it now produces a slightly different error for the minimal example from the beginning ot this thread (the 2.6.0 is green and the 2.9.1 red now)

$ mix deps.unlock cowlib
$ mix deps.get
Resolving Hex dependencies...

Failed to use "cowlib" (version 2.6.0) because
  cowboy (version 2.8.0) requires ~> 2.9.1
  gun (version 1.3.2) requires ~> 2.6.0

** (Mix) Hex dependency resolution failed, change the version requirements of your dependencies or unlock them (by using mix deps.update or mix deps.unlock). If you are unable to resolve the conflicts you can try overriding with {:dependency, "~> 1.0", override: true}

Does it have to do something with Mix phx.new deps error - cowlib - the dependency does not match the requirement ?

LostKobrakai

LostKobrakai

Ok, seems like there’s no version of phoenix 1.5, which depends on a cowboy/cowlib low enough to fulfill gun’s requirement. You could try to set the cowlib version in your mix.exs with override: true, but I’m not sure how much cowlib has changed.

odohMei7

odohMei7 OP

Maybe I am wrong but does this mean that gun is outdated and should not depend on old cowlib, i.e. one (=the maintainers of gun) should release a new version of gun to resolve this issue?

I will try to override cowlib to a lower version.

LostKobrakai

LostKobrakai

Essentially you’re correct. The changes for http → http2 (and upcoming http3) did result in a bunch of updates on the cowboy/cowlib site of things and gun wasn’t updated. There seems to be work for gun 2.0 on github though.

odohMei7

odohMei7 OP

So now I have

  defp deps do
    [
      {:phoenix, "~> 1.5.3"},
      {:phoenix_html, "~> 2.11"},
      {:phoenix_live_reload, "~> 1.2", only: :dev},
      {:phoenix_live_dashboard, "~> 0.2.0"},
      {:telemetry_metrics, "~> 0.4"},
      {:telemetry_poller, "~> 0.4"},
      {:gettext, "~> 0.11"},
      {:jason, "~> 1.0"},
      {:plug_cowboy, "~> 2.0"},
      {:cowlib, "~> 2.6.0", override: true},
      {:gun, "~> 1.3.2"},
    ]
  end

And it seems to work:

$ mix deps.get
Resolving Hex dependencies...
Dependency resolution completed:
Unchanged:
  cowboy 2.8.0
  file_system 0.2.8
  gettext 0.18.0
  jason 1.2.1
  mime 1.3.1
  phoenix 1.5.3
  phoenix_html 2.14.2
  phoenix_live_dashboard 0.2.6
  phoenix_live_reload 1.2.4
  phoenix_live_view 0.13.3
  phoenix_pubsub 2.0.0
  plug 1.10.3
  plug_cowboy 2.3.0
  plug_crypto 1.1.2
  ranch 1.7.1
  telemetry 0.4.2
  telemetry_metrics 0.5.0
  telemetry_poller 0.5.1
New:
  cowlib 2.6.0
  gun 1.3.2
* Updating cowlib (Hex package)
* Getting gun (Hex package)
$ mix compile
===> Compiling cowlib
===> Compiling cowboy
===> Compiling gun
==> plug_cowboy
Compiling 6 files (.ex)
Generated plug_cowboy app
==> phoenix
Compiling 66 files (.ex)
Generated phoenix app
==> phoenix_live_reload
Compiling 4 files (.ex)
Generated phoenix_live_reload app
==> phoenix_live_view
Compiling 18 files (.ex)
Generated phoenix_live_view app
==> phoenix_live_dashboard
Compiling 33 files (.ex)
Generated phoenix_live_dashboard app
==> test
Compiling 13 files (.ex)
Generated test app

But can this override cause any problems? Or am I on the safe side whenever it compiles as it apparently did?

benwilson512

benwilson512

Author of Craft GraphQL APIs in Elixir with Absinthe

Yes. Cowlib could work differently than gun expects, and there can be bugs at runtime. It is quite possible that it isn’t possible to use Phoenix 1.5 and gun 1.3 together at all.

odohMei7

odohMei7 OP

Too bad. But is there a way of using two versions of cowlib at the same time, one for gun 1.3 and another for Phoenix 1.5?

Where Next? Top

Trending in Questions Top

stjefim
Hello! Suppose you are building workflow (order / task / payment) processing system with the following requirements: Each workflow con...
New
Blokh
Hey guys, I’ve got a huge CSV ( around 10 GB ) that needs to be processed hourly Do you guys have any suggestions what is the best prac...
New
roeland
Kia ora, We have been using elixir-google-api to connect to Google Drive. However, with the updates to Tesla due to CVEs this is now bro...
New
kszambelanczyk
Hello! Could someone please give me a help/sample code, how to delete a file from s3 using waffle/waffle_ecto from Phoenix app. I creat...
New
Onor.io
I have what I’ve heard referred to as a “lookup table” in my database. This is a way of assigning codes to common values. One common lo...
New
jaybe78
Hello, I’m developing a online persistent chat system (what’s app) like using elixir/dynamodb/aws for a mobile app(flutter). The diffic...
New
Trolleger
What approach to take when sending live updates to “random” users Hi! I have a question, I have a little chat app, and when I create a DM...
New

Other Trending Topics Top

garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve. They are GUI (Emerge) and State management (S...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
wintermeyer
There are three potential reasons for members of this forum to have a look at https://vutuv.de You are tired or annoyed of LinkedIn. Yo...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews