Elixir
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.
Trending in News
Other Trending Topics
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
- #full-time-contract
- #podcasts-by-brainlid
- #ai
- #ecto-query
- #elixirconf-us
- #blog-post
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #elixirconf-eu
- #api
- #forms
- #metaprogramming
- #hex











Showing Posts 31 to 40- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
hubertlepicki
I assumed it was a log with level
:warnsneaking 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=6it’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
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:
and then use the following mix.exs as is:
I am now trying to figure out what’s wrong
josevalim
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!
Cervajz
Thank you @josevalim v1.15.0: Unable to assemble the release - optional dependencies (applications) are missing · Issue #12694 · elixir-lang/elixir · GitHub
I was unable to determine on which side the problem might be.
prihandi
I just tried the new version today.
First issue as other mentioned before,
ssl_verify_funbroken and need to be updated.Several surprising differences so far was formatting.
line_lengthconstraint becoming exactly 98 as docs said (previously it was 100 somehow), so runningmix format --check-formattedon existing code will be failed until we reformat (if we accidentally have lines with 100 chars length).'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
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
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
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.
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
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.
justincy
I’m seeing this error when running dialyzer with Dialyzer v5.1 Elixir 1.15 OTP 26
I guess that means Dialyxir isn’t fully loaded? This was working with Elixir v1.14.