Elixir

Elixir

Elixir Core Team

Official announcement: Elixir v1.15 released - The Elixir programming language

This release requires Erlang/OTP 24 and later.

Elixir v1.15 is a smaller release with focused improvements
on compilation and boot times. This release also completes
our integration process with Erlang/OTP logger, bringing new
features such as log rotation and compaction out of the box.

You will also find additional convenience functions in Code,
Map, Keyword, all Calendar modules, and others.

Compile and boot-time improvements

The last several releases brought improvements to compilation
time and this version is no different. In particular, Elixir
now caches and prunes load paths before compilation, ensuring your
project (and dependencies!) compile faster and in an environment
closer to production.

In a nutshell the Erlang VM loads modules from code paths. Each
application that ships with Erlang and Elixir plus each dependency
become an entry in your code path. The larger the code path, the
more work Erlang has to do in order to find a module.

In previous versions, Mix would only add entries to the load paths.
Therefore, if you compiled 20 dependencies and you went to compile
the 21st, the code path would have 21 entries (plus all Erlang and
Elixir apps). This allowed modules from unrelated dependencies to
be seen and made compilation slower the more dependencies you had.
With this release, we will now prune the code paths to only the ones
listed as dependencies, bringing the behaviour closer to mix release.

Furthermore, Erlang/OTP 26 allows us to start applications
concurrently and cache the code path lookups, decreasing the cost of
booting applications. The combination of Elixir v1.15 and Erlang/OTP 26
should reduce the boot time of applications, such as when starting
iex -S mix or running a single test with mix test, from 5% to 30%.

The compiler is also smarter in several ways: @behaviour declarations
no longer add compile-time dependencies and aliases in patterns and
guards add no dependency whatsoever, as no dispatching happens. Furthermore,
Mix now tracks the digests of @external_resource files, reducing the
amount of recompilation when swapping branches. Finally, dependencies
are automatically recompiled when their compile-time configuration changes.

Potential incompatibilities

Due to the code path pruning, if you have an application or dependency
that does not specify its dependencies on Erlang and Elixir application,
it may no longer compile successfully in Elixir v1.15. You can temporarily
disable code path pruning by setting prune_code_paths: false in your
mix.exs, although doing so may lead to runtime bugs that are only
manifested inside a mix release.

Compiler warnings and errors

The Elixir compiler can now emit many errors for a single file, making
sure more feedback is reported to developers before compilation is aborted.

In Elixir v1.14, an undefined function would be reported as:

** (CompileError) undefined function foo/0 (there is no such import)
    my_file.exs:1

In Elixir v1.15, the new reports will look like:

error: undefined function foo/0 (there is no such import)
  my_file.exs:1

** (CompileError) my_file.exs: cannot compile file (errors have been logged)

A new function, called Code.with_diagnostics/2, has been added so this
information can be leveraged by editors, allowing them to point to several
errors at once.

Potential incompatibilities

As part of this effort, the behaviour where undefined variables were
transformed into nullary function calls, often leading to confusing error
reports, has been disabled during project compilation. You can invoke
Code.compiler_options(on_undefined_variable: :warn)
at the top of your mix.exs to bring the old behaviour back.

Integration with Erlang/OTP logger

This release provides additional features such as global logger
metadata and file logging (with rotation and compaction) out-of-the-box!

This release also soft-deprecates Elixir’s Logger Backends in
favor of Erlang’s Logger handlers. Elixir will automatically
convert your :console backend configuration into the new
configuration. Previously, you would set:

config :logger, :console,
  level: :error,
  format: "$time $message $metadata"

Which is now translated to the equivalent:

config :logger, :default_handler,
  level: :error

config :logger, :default_formatter,
  format: "$time $message $metadata"

If you use Logger.Backends.Console with a custom device or other
backends, they are still fully supported and functional. If you
implement your own backends, you want to consider migrating to
:logger_backends
in the long term.

See the new Logger documentation for more information on the
new features and on compatibility.

Showing Posts 31 to 40

hubertlepicki

hubertlepicki

I assumed it was a log with level :warn sneaking in somewhere but no, the problem is different. I am still trying to pinpoint what’s going on, but the issue disappears completely with --max-cases=1, and then gradually starts to show up as I increase the concurrency of tests. At --max-cases=6 it’s almost always guaranteed to happen in my test suite.

Edit: I opened a bug report here: ExUnit.CaptureLog fails in tests on high concurrency · Issue #12692 · elixir-lang/elixir · GitHub we can move conversation there

Cervajz

Cervajz

Thank you for testing it.

I found that the issue is probably connected to fun_with_flags, specifically when runtime: false is used. It works with Elixir 1.14.5-otp-26.

I was able to replicate a minimal app that causes the issue:

mix new ek --sup --module EK

and then use the following mix.exs as is:

defmodule EK.MixProject do
  use Mix.Project

  def project do
    [
      app: :ek,
      version: "0.1.0",
      elixir: "~> 1.15",
      start_permanent: Mix.env() == :prod,
      deps: deps(),
      releases: [
        ek: [
          include_erts: true,
          include_executables_for: [:unix],
          applications: [
            ek: :permanent,
            fun_with_flags: :load
          ]
        ]
      ]
    ]
  end

  # Run "mix help compile.app" to learn about applications.
  def application do
    [
      extra_applications: [:logger],
      mod: {EK.Application, []}
    ]
  end

  # Run "mix help deps" to learn about dependencies.
  defp deps do
    [
      {:ecto_sql, "~> 3.6"},
      {:postgrex, ">= 0.0.0"},
      {:fun_with_flags, "~> 1.10.1", runtime: false}
    ]
  end
end
❯ mix release ek
Generated ek app
** (Mix) Could not find application :myxql

I am now trying to figure out what’s wrong :slight_smile:

josevalim

josevalim

Creator of Elixir

Can you please open up an issue with pretty much what you have here? So I don’t forget about it and then I can investigate it as soon as possible. Thank you!

prihandi

prihandi

I just tried the new version today.

First issue as other mentioned before, ssl_verify_fun broken and need to be updated.

Several surprising differences so far was formatting.

  • mix format default line_length constraint becoming exactly 98 as docs said (previously it was 100 somehow), so running mix format --check-formatted on existing code will be failed until we reformat (if we accidentally have lines with 100 chars length).
  • typespec for anonymous function replaced with empty string by formatter, ie
    @spec proces_fn((() -> term()), keyword()) :: term()
    
    will be replaced to
     @spec proces_fn(( -> term()), keyword()) :: term()
    
    Dialyzer works as expected, just feel a bit strange for me at first.
  • charlist written inside ' replaced with sigil ~c"" i.e 'word' become ~c"word"

I’ve checked the changelog, they’re already documented. So. no issues so far.

werkzeugh

werkzeugh

Thanks for the update!

I have noticed a small but annoying “but”:

➜ does anyone else find the new behavior of reporting multiple errors per file a bit tedious?

I find myself scrolling around a lot now,
in need to find the actual error embedded within the other warnings - as the last message is not always the actual error anymore.

It breaks my workflow so heavily (code reloading in Phoenix and seeing errors in the browser or doing recompile() in iex) that I reverted to 1.14 for now.

Is there maybe an option to re-enable the old behavior again?

josevalim

josevalim

Creator of Elixir

You should be able to see errors in the Phoenix error page. Make sure you are on latest and, if it still does not work, please let me know.

werkzeugh

werkzeugh

The error shows but in a different spot than before. Let me explain in detail.

If there are yet unsolved warnings (which one want to take care of later)
it makes it hard to glance in an instance what the error is you just introduced in your code.

Also, in iex, this is different than before:

The screenshots I chose have the number of warnings fit the screen, but I might have more of them.
I even think I saw an error once in the middle of the list of warnings.

➜ for terminal & browser that leads to scrolling around where the error is, which takes time and involves mousing.

  • in iex: it would be ideal to have the warnings first, error(s) last.
  • in phoenix error pages: error(s) first, warnings after

it was like this till 1.14

I could also live with hiding warnings in iex and Phoenix at all, as I mostly need them for elixir-ls anyway - but that seems also wrong to me.

I hope I don’t come around as nitpicky, but these details are important for developer experience, and error handling in elixir is known to be good.

josevalim

josevalim

Creator of Elixir

That’s a consequence of parallel compilation. We indeed may have warnings from other files overlapping. We will see how to improve it, we should at least hide the shutdown message, but the new behavior is somewhat expected.

But also, if that is motivation to fix warnings, even better. :slight_smile:

justincy

justincy

I’m seeing this error when running dialyzer with Dialyzer v5.1 Elixir 1.15 OTP 26

** (UndefinedFunctionError) function Dialyxir.Output.info/1 is undefined (module Dialyxir.Output is not available)
    (dialyxir 1.3.0) Dialyxir.Output.info("Finding suitable PLTs")
    (dialyxir 1.3.0) lib/mix/tasks/dialyzer.ex:172: Mix.Tasks.Dialyzer.run/1
    (mix 1.15.0) lib/mix/task.ex:447: anonymous fn/3 in Mix.Task.run_task/5
    (mix 1.15.0) lib/mix/cli.ex:92: Mix.CLI.run_task/2

I guess that means Dialyxir isn’t fully loaded? This was working with Elixir v1.14.

Where Next? Top

Trending in News Top

Other Trending Topics Top

GenericJam
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
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
budgie
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

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews