View Source Changelog for Elixir v1.15
This release requires Erlang/OTP 24 and later.
Elixir v1.15 is a smaller release, with further improvements to compilation and boot times. This release also completes our integration process with Erlang/OTP logger, bringing new features such as log rotation and compactation out of the box.
Finally, you will also find additional convenience functions in
Map
, Keyword
, all Calendar modules, and many more.
compile-and-boot-time-improvements
Compile and boot-time improvements
The last several releases brought improvements to compilation time and this version is no different. In particular, this version 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 end-up being 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 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.
In this release, we will now prune the code paths to only the ones
listed as dependencies. Previously if you attempted to use an Erlang/OTP
or Elixir module without adding its dependency, we would warn. Now
the module won't be found altogether, which is also the behaviour you see
if you ran your application as a mix release
. If you are using an
application that does not correctly lists its dependencies, they will
have to be updated accordingly (as previously warned).
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 15%.
compiler-warnings-and-errors
Compiler warnings and errors
TODO.
integration-with-erlang-otp-logger
Integration with Erlang/OTP logger
This provides additional features such as global logger metadata and
file logging (with rotation and compactation) out-of-the-box! See
the Logger
documentation for more information.
TODO: Mention :console vs Logger.Backends.Console
v1-15-0-dev
v1.15.0-dev
1-enhancements
1. Enhancements
EEx
- [EEx] Include source code snippets in syntax errors
Elixir
- [Calendar] Add support for epoch time (%s) to
Calendar.strftime/2
- [Code]
Code.format_string!/2
now converts'charlists'
into~c"charlists"
by default - [Code] Add
:on_undefined_variable
to the compiler options to preserve the warning behaviour which was deprecated back in Elixir v1.4 - [Code] Add
Code.loaded?/1
andCode.ensure_all_loaded(!)/1
- [Code] Add
Code.prepend_paths/1
,Code.append_paths/1
, andCode.delete_paths/1
- [Code] Support nested expressions in
Code.cursor_context/1
- [Date] Add
Date.before?/2
andDate.after?/2
- [DateTime] Add
DateTime.before?/2
andDateTime.after?/2
- [Inspect]
Inspect
now renders'charlists'
as~c"charlists"
by default - [Kernel] Add
t:nonempty_binary/0
andt:nonempty_bitstring/0
- [Kernel] Treat
@behaviour
s as runtime dependencies - [Kernel] Do not add runtime dependencies for alias references in patterns and guards
- [Kernel] Warn for nested calls without parens inside keywords
- [Kernel] Support for multi-letter uppercase sigils
- [Kernel] Introduce mechanism to collect several errors in a module. Previously, as soon as there was a compilation error, compilation would fail. Now the compiler became a bit smarter and will report multiple errors whenever possible as multiple
error: ...
messages, similar towarning: ...
- [Kernel.CLI] Support
--sname undefined
/--name undefined
so a name is automatically generated - [Keyword] Add
Keyword.split_with/2
- [Macro] Improve error message when piping into an expression ending in bracket-based access
- [Map] Add
Map.split_with/2
- [Map] Add
Map.intersect/2
andMap.intersect/3
- [MapSet] Add
MapSet.split_with/2
- [MapSet] Optimize most functions
- [NaiveDateTime] Add
NaiveDateTime.beginning_of_day/1
andNaiveDateTime.end_of_day/1
- [NaiveDateTime] Add
NaiveDateTime.before?/2
andNaiveDateTime.after?/2
- [Process] Add
Process.alias/0,1
andProcess.unalias/1
- [Range] Add
Range.split/2
- [String] Update Unicode to version 15.0.0
- [String] Add
:fast_ascii
mode toString.valid?/2
- [Supervisor] Add support for automatic shutdown in
Supervisor
- [System] Support
:lines
inSystem.cmd/3
to capture output line by line - [Task] Remove head of line blocking on
Task.yield_many/2
- [Task] Enable selective receive optimizations in Erlang/OTP 26+
- [Time] Add
Time.before?/2
andTime.after?/2
- [URI] Add
URI.append_path/2
ExUnit
- [ExUnit] Add more color configuration to ExUnit CLI formatter
- [ExUnit.Callbacks] Accept
{module, function}
tuples in ExUnitsetup
callbacks - [ExUnit.Doctest] Add
ExUnit.DocTest.doctest_file/2
- [ExUnit.Formatter] When comparing to anonymous functions, defined at the same place but capturing a different environment, we will now also diff the environments
IEx
- [IEx] Make pry opt-in on dbg with
--dbg pry
- [IEX] Support
IEX_HOME
- [IEx.Helpers] Add
runtime_info(:allocators)
- [IEx.Info] Implement protocol for
Range
,DateTime
andRegex
Logger
- [Logger] Add
Logger.add_handlers/1
andLogger.default_formatter/1
- [Logger] Introduce
default_formatter
anddefault_handler
configuration for Logger which configures Erlang/OTP logger - [Logger.Formatter] Implement the Erlang Logger formatter API
- [Logger.Formatter] Add support for ports in Logger metadata
Mix
- [Mix.Project] Support
def cli
to unify all CLI defaults in a single place - [mix eval] Allow passing additional arguments
- [mix compile] Set
--all-warnings
by default - [mix compile.app] Write
optional_applications
to.app
file - [mix compile.elixir] Add
--purge-consolidation-path-if-stale
which will purge the given consolidation path if compilation is required - [mix deps.get] Automatically install Hex and Rebar on
mix deps.get
/mix deps.update
- [mix deps.get] Support
--check-locked
which raises if changes to the lockfile are required - [mix format] Allow multiple formatters per file extension and sigil
- [mix format] Show diffs whenever
--check-formatted
fails - [mix profile.fprof] Support
--trace-to-file
to improve performance when working with large outputs - [mix release] Allow passing additional arguments to the
eval
command - [mix xref graph] Support
--output
flag
2-bug-fixes
2. Bug fixes
Elixir
- [Code.Formatter] Fix a scenario where a keyword followed by parenthesis could go above the maximum line length
- [Code.Formatter] Remove unnecessary parens in nullary type funs
- [File] Do not raise if there are file system race conditions in
File.cp/2
- [Kernel] Expand macros on the left side of -> in
try/rescue
- [Kernel] Raise on misplaced
...
inside typespecs - [Kernel.ParallelCompiler] Make sure compiler doesn't crash when there are stray messages in the inbox
- [Kernel.ParallelCompiler] Track compile and runtime warnings separately
- [URI] Make sure
URI.merge/2
works accordingly with relative paths
ExUnit
- [ExUnit] Fix crash when
@tag capture_log: true
was set to true and the Logger application was shut down in the middle of the test - [ExUnit] Do not merge context as tags inside the runner to reduce memory usage when emitting events to formatters
- [ExUnit] Do not expand or collect vars from quote in ExUnit assertions
IEx
- [IEx] Do not spawn a process to read IO. This fixes a bug where multiline paste stopped working whenever the input reader was killed
- [IEx] Do not perform completion for prompts triggered during code evaluation
Mix
- [mix release] Fix Windows service when invoking
erlsrv.exe
in path with spaces
3-soft-deprecations-no-warnings-emitted
3. Soft deprecations (no warnings emitted)
Mix
- [Mix.Project]
:preferred_cli_env
is deprecated in favor of:preferred_envs
indef cli
- [Mix.Project]
:preferred_cli_target
is deprecated in favor of:preferred_targets
indef cli
4-hard-deprecations
4. Hard deprecations
Elixir
- [Calendar]
Calendar.ISO.day_of_week/3
is deprecated in favor ofCalendar.ISO.day_of_week/4
- [Exception]
Exception.exception?/1
is deprecated in favor ofKernel.is_exception/1
- [Kernel] Deprecate
...
as a valid function call identifier - [Regex]
Regex.regex?/1
is deprecated in favor ofKernel.is_struct/2
Logger
- [Logger]
Logger.warn/2
is deprecated in favor ofLogger.warning/2
v1-14
v1.14
The CHANGELOG for v1.14 releases can be found in the v1.14 branch.