I see now, haven't used igniter other than for setting up Oban. The mix tasks do exactly what I thought. While it would be nice to have in the Elixir core these works so I guess nothing to see here :P. Thanks all!
On Fri, Feb 27, 2026 at 4:38 PM Zach Daniel <[email protected]> wrote: > Yep, I would personally suggest looking into igniter. In addition to > supporting rich installers via `mix igniter.install`, it also supports just > `mix igniter.add` and `mix igniter.remove` etc. > > > On Fri, Feb 27, 2026 at 4:06 PM, Christopher Keele < > [email protected]> wrote: > >> My recommendation would be `*~> MAJOR.MINOR.PATCH*` by default and `*~> >> MAJOR.MINOR*` for `*--only dev*`/`*--only test*`. >> >> Don't forget to consider `*Mix.target <http://mix.target/>()*` in your >> proposal, and multiple envs. Would `*--only-env*`/`*--only-target*` be >> better, or just `*--env*`/`*--target*`? Comma separated for multiple, or >> repeated flag, or both? >> >> Also consider how this would work for already specified dependences. >> Refusal to proceed? Update the version? What about with disjoint sets of >> envs/targets? Etc. >> >> On Friday, February 27, 2026 at 12:07:46 PM UTC-6 [email protected] >> wrote: >> >>> I'd love to see this implemented. >>> >>> When adding a dependency, most of the time I just want the latest >>> version. Having the CLI fetch that without having to navigate to hex.pm >>> myself would be really nice to have! >>> >>> Agree that `~> MAJOR.MINOR` is the correct version format to default to >>> when adding. >>> >>> On Friday, February 27, 2026 at 7:40:30 AM UTC-8 [email protected] >>> wrote: >>> >>>> This isn't a criticism of Mix's current design - I like that `mix.exs` >>>> is transparent and editable. But for the common case of adding or removing >>>> a dependency, there's unnecessary friction compared to other modern package >>>> managers like cargo in Rust or uv in Python. >>>> >>>> Adding a dependency currently means: open `mix.exs` → find the `deps` >>>> function → remember the tuple syntax → look up the version format → add the >>>> entry → save → run `mix deps.get`. >>>> >>>> For complex cases with conditional logic or special constraints, >>>> editing the file directly makes sense. But for "add this package from Hex" >>>> it's more ceremony than needed. >>>> >>>> *Proposal* >>>> >>>> Add two new Mix tasks: `mix deps.add` and `mix deps.remove` that handle >>>> the common case of adding or removing dependencies from your project. >>>> >>>> ### `mix deps.add` >>>> >>>> Adds one or more dependencies to your `mix.exs` file and fetches them. >>>> >>>> ```bash >>>> # Add latest version from Hex >>>> mix deps.add phoenix >>>> >>>> # Add with version requirement >>>> mix deps.add phoenix ~> 1.7 >>>> >>>> # Add from git >>>> mix deps.add phoenix --git >>>> https://github.com/phoenixframework/phoenix.git >>>> >>>> # Add from GitHub (shorthand) >>>> mix deps.add phoenix --github phoenixframework/phoenix --tag v1.7.0 >>>> >>>> # Add from local path >>>> mix deps.add my_lib --path ../my_lib >>>> >>>> # Add with options >>>> mix deps.add phoenix --only dev >>>> mix deps.add benchee --only test --optional >>>> mix deps.add jason --override >>>> >>>> # Add to umbrella app >>>> mix deps.add my_app --in-umbrella >>>> >>>> # Mix and match multiple packages >>>> mix deps.add phoenix ecto_sql postgrex >>>> ``` >>>> >>>> ### `mix deps.remove` >>>> >>>> Removes one or more dependencies from your `mix.exs` file. >>>> >>>> ```bash >>>> # Remove a package >>>> mix deps.remove phoenix >>>> >>>> # Remove multiple packages >>>> mix deps.remove phoenix ecto postgrex >>>> ``` >>>> >>>> ## Options >>>> >>>> The commands would need to support Mix's existing dependency options: >>>> >>>> - Source: `--git`, `--github`, `--path`, `--in-umbrella` >>>> - Git: `--tag`, `--branch`, `--ref`, `--sparse`, `--subdir`, >>>> `--submodules` >>>> - Environment: `--only`, `--targets`, `--optional`, `--override`, >>>> `--runtime`, `--env` >>>> - Hex: `--hex`, `--repo` >>>> - Behavior: `--no-fetch` (skip `mix deps.get` after modifying `mix.exs`) >>>> >>>> ## More Examples >>>> >>>> ```bash >>>> # Test-only dependency >>>> mix deps.add ex_machina --only test >>>> >>>> # Optional dependency (for library authors) >>>> mix deps.add hackney --optional >>>> >>>> # Override conflicting transitive dependency >>>> mix deps.add tesla --override >>>> >>>> # Local development >>>> mix deps.add my_lib --path ~/projects/my_lib >>>> >>>> # Umbrella app >>>> cd apps/my_workers && mix deps.add my_core --in-umbrella >>>> >>>> # Git with specific options >>>> mix deps.add phoenix_live_view --github >>>> phoenixframework/phoenix_live_view --tag v1.0.0 >>>> ``` >>>> >>>> The tricky part is modifying `mix.exs` while preserving formatting, >>>> comments, and custom logic. AST manipulation can handle the parsing, but >>>> needs care with formatting. >>>> >>>> For version resolution, when no version is specified, query Hex for the >>>> latest and use `~> MAJOR.MINOR`. >>>> >>>> The generated deps should look like hand-written ones: >>>> ```elixir >>>> {:phoenix, "~> 1.7"} >>>> {:credo, "~> 1.6", only: [:dev, :test], runtime: false} >>>> {:my_lib, path: "../my_lib"} >>>> ``` >>>> >>>> These commands are for common cases. Complex scenarios with conditional >>>> logic still need direct `mix.exs` editing - that's fine. This is about >>>> making "add this Hex package" frictionless, not about replacing the >>>> file-based approach entirely. >>>> >>>> I'm happy to discuss further or implement this if the proposal seems >>>> reasonable. >>>> >>> -- >> You received this message because you are subscribed to the Google Groups >> "elixir-lang-core" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> To view this discussion visit >> https://groups.google.com/d/msgid/elixir-lang-core/9293826d-e802-43c5-ba7a-bbfd6562014en%40googlegroups.com >> <https://groups.google.com/d/msgid/elixir-lang-core/9293826d-e802-43c5-ba7a-bbfd6562014en%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > > -- > You received this message because you are subscribed to a topic in the > Google Groups "elixir-lang-core" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/elixir-lang-core/LRufQItVlVE/unsubscribe > . > To unsubscribe from this group and all its topics, send an email to > [email protected]. > To view this discussion visit > https://groups.google.com/d/msgid/elixir-lang-core/mm5ey1d0.ca7e9ec5-dbf1-46cd-af23-8332b389c830%40we.are.superhuman.com > <https://groups.google.com/d/msgid/elixir-lang-core/mm5ey1d0.ca7e9ec5-dbf1-46cd-af23-8332b389c830%40we.are.superhuman.com?utm_medium=email&utm_source=footer> > . > -- [image: created with MySignature.io] Dairon Medina Caro Freelance Software Developer M: +1 (813) 325-6978 <+1+(813)+325-6978> E: [email protected] dairon.org [image: created with MySignature.io] <https://github.com/codeadict> [image: created with MySignature.io] <http://codeadict> <https://mysignature.io?utm_source=promotion&utm_medium=signature&utm_campaign=create_own_signature> -- You received this message because you are subscribed to the Google Groups "elixir-lang-core" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion visit https://groups.google.com/d/msgid/elixir-lang-core/CAER-KdDgX%3DiEPT3DWRUgkuJUQe3VhhFJvq171p5K6snWECheOQ%40mail.gmail.com.
