Elixir

Elixir

Elixir Core Team

Elixir v1.15.0 released

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.

Most Liked

Ivor

Ivor

Adding OTP 26

For Elixir 1.14.3-otp-25:
Total time: 62.63 seconds

For Elixir 1.15.0-otp-25:
Total time: 43.487 seconds
This represents a ~30.6% decrease in time compared to Elixir 1.14.3-otp-25.

For Elixir 1.15.0-otp-26:
Total time: 26.758 seconds
This represents a ~57.3% decrease in time compared to Elixir 1.14.3-otp-25.

CPU utliization for for OTP 26:
CPU percentage: 581% (367% for OTP 25, 257% for Elixir 1.14.3)
(Apple M1 Pro + 16Gb memory)

josevalim

josevalim

Creator of Elixir

Please see: Include application specification for mix.exs by josevalim · Pull Request #27 · deadtrickster/ssl_verify_fun.erl · GitHub

Meanwhile users can work around this by specifying {:ssl_verify_fun, ..., manager: :rebar3} in their def deps do.

hubertlepicki

hubertlepicki

I have added this line:

{:ssl_verify_fun, "~> 1.1.6", manager: :rebar3, only: [:test], runtime: false, override: true}

then I removed deps/ and _build directories, ran mix deps.get and it compiles now. I suspect one of the extra steps I did was required too, i.e. maybe your system figured out it already has version 1.1.6 and didn’t actually update the code. Try removing deps/ and _build dirs to see if this helps.

@josevalim fixed for now, thank you!

Ref. the compilation performance, indeed there is an improvement, which is great:

Elixir 1.14.3: mix compile 658.72s user 71.35s system 417% cpu 2:54.69 total
Elixir 1.15.0: mix compile 582.92s user 56.97s system 445% cpu 2:23.57 total

This is on a real-life and fairly big project.

josevalim

josevalim

Creator of Elixir

Nice! You should get considerable more speedups on Erlang/OTP 26 (and also on Erlang/OTP 25 if you are on Apple Silicon).

rubysolo

rubysolo

Ah, got it – thanks! (seems obvious in hindsight)

FWIW, going from 1.14.4-otp-25 to 1.15.0-otp-25 takes our compilation from ~163 sec to ~51 sec! (M1 Max / 64GB)

Where Next?

Popular in News Top

josevalim
Hi everyone, We are glad to announce that the second release candidate for Elixir v1.6.0 is out. Check out the CHANGELOG and give the...
New
josevalim
Hello folks, There has been some doubts regarding StreamData and PropertyTesting in Elixir so we have decided to open up a thread to an...
New
josevalim
The goal of private modules is to define a module that cannot be trivially accessed by other modules where they are not visible to. In t...
New
josevalim
I hereby officially announce the Elixir type system effort is transitioning from research into development. Read the full-announcement he...
639 11510 165
New
josevalim
See the release notes: https://github.com/elixir-ecto/ecto/releases/tag/2.2.0-rc.0 To try it in your projects: {:ecto, "~> 2.2.0-rc"...
New
whatyouhide
Hello folks, the Elixir team (well me, but I got a thumbs up from the others :P) is looking for contributors and potentially maintainer...
New
josevalim
In Elixir we are continuously trying to improve the experience for developers learning the language. However, there are still common road...
New
josevalim
Elixir v1.5.0-rc.0 has been released. This is a release candidate for the upcoming Elixir v1.5. It includes bug fixes, enhancements and...
New
Elixir
Type system improvements Type checking of protocol dispatch and implementations This release also adds type checking when dispatching and...
New
Elixir
Release: https://github.com/elixir-lang/elixir/releases/tag/v1.9.1 1. Enhancements Mix [mix format] Print relative paths in --check-for...
New

Other popular topics Top

sergio
I couldn’t find any guides that worked well with Phoenix 1.6.0 and esbuild. I hope this helps people test the waters and eases you into t...
New
AstonJ
You’re a programmer, so you don’t need spoon feeding with the conventional drivel about “this is an integer.” No. You need to know what’s...
New
grych
Hi folks, Few months ago I have announced the proof-of-concept of the library to manipulate the browsers DOM objects directly from Elixi...
639 49522 488
New
fireproofsocks
I’m working on defining a simple Ecto schema for a table (in PostGres), but I don’t see where I can define a column as NOT NULL. Conside...
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
qwerescape
Is there a way to get the call stack or stack trace at any point in the code? Not from exceptions, but an expression that returns how the...
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New

We're in Beta

About us Mission Statement