Журнал изменений для Elixir v1.15
Для этой версии требуется Erlang/OTP 24 и выше.
Elixir v1.15 — это небольшое обновление со сфокусированными улучшениями времени компиляции и запуска. Это обновление также завершает интеграцию с логгером Erlang/OTP, добавляя такие новые функции, как ротация и уплотнение логов «из коробки».
Вы также найдете дополнительные удобные функции в Code, Map, Keyword, во всех модулях Calendar и других.
Улучшения времени компиляции и запуска
Несколько последних релизов принесли улучшения времени компиляции, и эта версия не исключение. В частности, Elixir теперь кэширует и обрезает пути загрузки перед компиляцией, гарантируя, что ваш проект (и зависимости!) будут компилироваться быстрее и в среде, более близкой к производственной.
Вкратце, виртуальная машина Erlang загружает модули из путей кода. Каждое приложение, поставляемое с Erlang и Elixir, а также каждая зависимость становятся записью в вашем пути кода. Чем длиннее путь кода, тем больше работы Erlang выполняет для поиска модуля.
В предыдущих версиях Mix добавлял записи только в пути загрузки. Поэтому, если вы компилировали 20 зависимостей, а затем пытались скомпилировать 21-ю, путь кода содержал бы 21 запись (плюс все приложения Erlang и Elixir). Это позволяло модулям из несвязанных зависимостей быть видимыми, что замедляет компиляцию с увеличением количества зависимостей. В этом релизе мы будем обрезать пути кода, оставляя только те, которые указаны как зависимости, приблизив поведение к mix release.
Кроме того, Erlang/OTP 26 позволяет запускать приложения параллельно и кэшировать запросы по пути кода, уменьшая затраты на запуск приложений. Комбинация Elixir v1.15 и Erlang/OTP 26 должна уменьшить время запуска приложений, например, при запуске iex -S mix или выполнении одного теста с помощью mix test, с 5% до 30%.
Компилятор также стал умнее в нескольких аспектах: объявления @behaviour больше не добавляют зависимостей во время компиляции, а псевдонимы в шаблонах и охранных условиях не добавляют зависимостей, так как распределение не происходит. Кроме того, Mix теперь отслеживает дайджесты @external_resource файлов, уменьшая количество повторных компиляций при переключении ветвей. Наконец, зависимости автоматически перекомпилируются при изменении их конфигурации во время компиляции.
Возможные несовместимости
Из-за обрезки пути кода, если у вас есть приложение или зависимость, которая не указывает свои зависимости от приложений Erlang и Elixir, оно может больше не компилироваться успешно в Elixir v1.15. Вы можете временно отключить обрезку пути кода, установив prune_code_paths: false в вашем mix.exs, хотя это может привести к ошибкам во время выполнения, которые проявляются только внутри mix release.
Предупреждения и ошибки компилятора
Компилятор Elixir теперь может выдавать множество ошибок для одного файла, обеспечивая больше обратной связи разработчикам перед прерыванием компиляции.
В Elixir v1.14 неопределенная функция сообщалась так:
** (CompileError) undefined function foo/0 (there is no such import)
my_file.exs:1
В Elixir v1.15 новые сообщения выглядят так:
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)
Была добавлена новая функция, Code.with_diagnostics/2, для использования этой информации редакторами, позволяя им указывать сразу на несколько ошибок.
Возможные несовместимости
В рамках этой работы поведение, где неопределенные переменные преобразовывались в вызовы нульарных функций, часто приводя к путанице в сообщениях об ошибках, было отключено во время компиляции проекта. Вы можете вызвать Code.compiler_options(on_undefined_variable: :warn) в начале вашего mix.exs для возврата старого поведения.
Интеграция с логгером Erlang/OTP
Этот релиз предоставляет дополнительные функции, такие как метаданные глобального логгера и журналирование в файлы (с ротацией и уплотнением) «из коробки»!
В этом релизе также происходит мягкое устаревание бэкендов логгера Elixir в пользу обработчиков логгера Erlang. Elixir автоматически преобразует вашу конфигурацию бэкенда :console в новую конфигурацию. Раньше вы устанавливали:
config :logger, :console, level: :error, format: "$time $message $metadata"
Что теперь преобразуется в эквивалент:
config :logger, :default_handler, level: :error config :logger, :default_formatter, format: "$time $message $metadata"
Если вы используете Logger.Backends.Console с пользовательским устройством или другими бэкендами, они по-прежнему полностью поддерживаются и функциональны. Если вы реализуете собственные бэкенды, в долгосрочной перспективе стоит рассмотреть возможность миграции на :logger_backends.
См. новую документацию Logger для получения дополнительной информации о новых функциях и совместимости.
v1.15.4 (2023-07-18)
1. Исправления ошибок
Mix
- [mix archive.build] Отключить консолидацию протоколов при создании архивов в archive.install
- [mix compile] Отслеживать удаленные файлы по локальным зависимостям (это исправляет ошибку, когда файлы, зависящие от модулей из зависимостей путей, всегда перекомпилировались)
- [mix release] Не удалять соответствующие части из Erlang/OTP 26
v1.15.3 (2023-07-15)
1. Улучшения
Elixir
- [Kernel] Улучшение отладки стека при выполнении не вложенного кода Elixir в файле
Mix
- [Mix] Разрешить отказаться от запуска приложений в
Mix.install/2
2. Исправления ошибок
Elixir
- [Code] Гарантировать, что
with_diagnosticsраспространяют предупреждения из внутренних проходов Erlang
IEx
- [IEx] Исправить
--remshв Erlang/OTP 25 и ранее
Mix
- [mix compile.elixir] Гарантировать, что обратные вызовы
__mix_recompile__?корректно вызываются
v1.15.2 (2023-07-01)
1. Исправления ошибок
IEx
- [IEx] Исправить невозможность загрузки CLI в Windows
v1.15.1 (2023-06-30)
1. Улучшения
- [Code]
Code.string_to_quoted/2учитывает:static_atoms_encoderдля многобуквенных сигилов
2. Исправления ошибок
ExUnit
- [ExUnit.CaptureLog] Исправить гонку при одновременных
capture_log - [ExUnit.CaptureLog] Учитывать опции, переданные вложенным
capture_logвызовам - [ExUnit.Doctest] Правильно компилировать doctest без результатов, завершенных ограждениями
- [ExUnit.Doctest] Разрешить использование переменных, определенных в doctest, в ожидании
IEx
- [IEx] Гарантировать, что
pryработает в Erlang/OTP 25 и ранее во время запуска IEx - [IEx]
Code.Fragment.surround_contextучитывает контекст вокруг пробелов и скобок
Logger
- [Logger] Не предполагать, что Logger загружен во время компиляции
- [Logger.Formatter] Правильно обрабатывать
:functionкак метаданные
Mix
- [mix compile] Гарантировать, что текущий проект доступен в пути кода после компиляции его Elixir-источников
- [mix compile] Гарантировать доступность yecc/leex при выводе предупреждений из предыдущих запусков
- [mix compile] Исправить ошибку, когда внешний ресурс удалялся после успешного получения его mtime
- [mix compile] Отслеживать удаленные модули и экспорты в локальных зависимостях
- [mix deps] Исправить проблему, из-за которой зависимости не могли быть запущены в проектах-зонтиках
- [mix release] Правильно обрабатывать необязательные зависимости при наличии конфликта в режиме запуска приложения
- [mix release] Удалить
--werlиз скриптов выпуска в Erlang/OTP 26
v1.15.0 (2023-06-19)
1. Улучшения
EEx
- [EEx] Включать фрагменты исходного кода в сообщения об ошибках синтаксиса
Elixir
- [Calendar] Добавлена поддержка времени эпохи (
%s) вCalendar.strftime/2 - [Code]
Code.format_string!/2теперь по умолчанию преобразует'charlists'в~c"charlists" - [Code] Добавлено
:on_undefined_variableв параметры компилятора для сохранения поведения предупреждений, которое было устаревшим в Elixir v1.4 - [Code] Добавлено
Code.loaded?/1иCode.ensure_all_loaded(!)/1 - [Code] Добавлено
Code.prepend_paths/1,Code.append_paths/1иCode.delete_paths/1 - [Code] Добавлено
Code.with_diagnostics/2для возврата диагностики при компиляции и оценке кода - [Code.Fragment] Поддержка вложенных выражений в
Code.Fragment.cursor_context/1 - [Code.Fragment] Сохранение операторов и вызовов без скобок в
Code.Fragment.container_cursor_to_quoted/1 - [Date] Добавлено
Date.before?/2иDate.after?/2 - [DateTime] Добавлено
DateTime.before?/2иDateTime.after?/2 - [DateTime] Поддержка точности в
DateTime.utc_now/2 - [File] Поддержка распределённых
File.Stream - [Inspect]
Inspectтеперь по умолчанию отображает'charlists'как~c"charlists" - [Kernel] Разделение
caseиcondвнутриdbg/2 - [Kernel] Добавлено
t:nonempty_binary/0иt:nonempty_bitstring/0 - [Kernel] Обработка
@behaviourкак зависимостей времени выполнения - [Kernel] Не добавлять зависимости времени выполнения для ссылок на псевдонимы в шаблонах и защитах
- [Kernel] Выводить предупреждение при вложенных вызовах без скобок внутри ключевых слов
- [Kernel] Поддержка многобуквенных заглавных сигилов
- [Kernel] Введён механизм сбора нескольких ошибок в модуле. Раньше, как только возникала ошибка компиляции, компиляция прекращалась. Теперь компилятор стал немного умнее и будет сообщать о нескольких ошибках, когда это возможно, как несколько сообщений
error: ..., аналогичноwarning: ... - [Kernel] Вызывать исключение вместо предупреждения при неопределённых переменных. Ранее неопределённая переменная пыталась вызвать функцию с тем же именем, что приводило к путанице в сообщениях об ошибках, особенно для новичков. Чтобы включить предыдущее поведение, вызовите
Code.compiler_options(on_undefined_variable: :warn)в начале вашегоmix.exs - [Kernel.CLI] Поддержка
--sname undefined/--name undefinedдля автоматического генерации имени - [Keyword] Добавлено
Keyword.split_with/2 - [Macro] Улучшено сообщение об ошибке при передаче в выражение, заканчивающееся доступом через скобки
- [Macro.Env] Добавлено
Macro.Env.lookup_alias_as/2 - [Map] Добавлено
Map.split_with/2 - [Map] Добавлено
Map.intersect/2иMap.intersect/3 - [MapSet] Добавлено
MapSet.split_with/2 - [MapSet] Оптимизация большинства функций
- [NaiveDateTime] Добавлено
NaiveDateTime.beginning_of_day/1иNaiveDateTime.end_of_day/1 - [NaiveDateTime] Добавлено
NaiveDateTime.before?/2иNaiveDateTime.after?/2 - [NaiveDateTime] Поддержка точности в
NaiveDateTime.utc_now/2 - [Module] Отметка функций как сгенерированных в блоке "Docs"
- [Module] Добавлено
Module.get_last_attribute/3 - [OptionParser] Поддержка параметра
:return_separator - [Process] Добавлено
Process.alias/0,1иProcess.unalias/1 - [Range] Добавлено
Range.split/2 - [String] Обновление Unicode до версии 15.0.0
- [String] Добавление режима
:fast_asciiвString.valid?/2 - [Supervisor] Добавлена поддержка автоматического завершения в
Supervisor - [System] Поддержка
:linesвSystem.cmd/3для захвата выходных данных строка за строкой - [Task] Удаление блокировки начала строки при
Task.yield_many/2 - [Task] Включение оптимизаций выборочного приема в Erlang/OTP 26+
- [Task] Сокращение ресурсопотребления задач путём избежания ненужной работы при запуске
- [Task.Supervisor] Не копировать аргументы при временном
Task.Supervisor.start_child/2 - [Time] Добавлено
Time.before?/2иTime.after?/2 - [URI] Добавлено
URI.append_path/2
ExUnit
- [ExUnit] Добавлен более расширенный конфигурирование цвета форматирования ExUnit CLI
- [ExUnit.Callbacks] Принимаются кортежи
{module, function}в колбеках ExUnitsetup - [ExUnit.Case] Добавлено
ExUnit.Case.get_last_registered_test/1 - [ExUnit.Doctest] Добавлено
ExUnit.DocTest.doctest_file/2 - [ExUnit.Doctest] Включены
doctest_dataв теги doctest - [ExUnit.Formatter] При сравнении двух анонимных функций, определённых в одном месте, но захватывающих разную среду, теперь также сравнивается и среда
IEx
- [IEx] Включить pry в dbg по умолчанию с
--dbg pry - [IEX] Поддержка
IEX_HOME - [IEx.Autocomplete] Предоставлять псевдонимы только при автозаполнении
alias,import, иrequire - [IEx.Autocomplete] Предоставлять завершение поля при обновлении map и struct
- [IEx.Helpers] Добавлено
runtime_info(:allocators) - [IEx.Info] Реализован протокол для
Range,DateTimeиRegex
Logger
- [Logger] Добавлено
Logger.add_handlers/1иLogger.default_formatter/1 - [Logger] Введение конфигурации
default_formatterиdefault_handlerдля Logger, настраивающей логгер Erlang/OTP - [Logger] Добавлена конфигурация
:always_evaluate_messagesдля Logger - [Logger.Formatter] Реализован API форматирования логгера Erlang
- [Logger.Formatter] Добавлена поддержка портов в метаданных Logger
Mix
- [mix app.start] Разрешение одновременного запуска приложений через конфигурацию
:start_concurrently - [mix compile] Установлено значение
--all-warningsпо умолчанию - [mix compile] Сокращение количества обращений к файловой системе для зависимостей путём сохранения временных меток в манифестах
- [mix compile] Отслеживание дайджестов
@external_resources - [mix compile.app] Запись
optional_applicationsв файл.app - [mix compile.elixir] Добавлено
--purge-consolidation-path-if-staleдля очищения указанного пути консолидации при необходимости компиляции - [mix deps.compile] Автоматическая перекомпиляция зависимостей при изменении их среды компиляции
- [mix deps.get] Автоматическая установка Hex и Rebar на
mix deps.get/mix deps.update - [mix deps.get] Поддержка
--check-lockedкоторая вызывает исключение, если требуются изменения в файле блокировки - [mix eval] Разрешение передачи дополнительных аргументов
- [mix format] Поддержка параметра
--no-exit - [mix format] Разрешение использования нескольких форматировщиков для каждого расширения файла и сигила
- [mix format] Отображение различий, когда
--check-formattedтерпит неудачу - [mix format] Разрешение конфигурирования корневого каталога форматирования
- [mix loadpaths] Кэширование зависимостей и архивов путей загрузки в Erlang/OTP 26
- [mix profile.fprof] Поддержка
--trace-to-fileдля повышения производительности при работе с большими выводами - [mix release] Разрешение передачи дополнительных аргументов команде
eval - [mix xref graph] Поддержка флага
--output - [Mix.Project] Поддержка
def cliдля объединения всех значений по умолчанию CLI в одном месте - [Mix.Project] Добавлено
Mix.Project.deps_tree/1
2. Исправления ошибок
Elixir
- [Code.Formatter] Исправление ситуации, когда ключевое слово, за которым следует скобка, могло превысить максимальную длину строки
- [Code.Formatter] Удаление нежелательных скобок в функциях нулевой арности
- [Exception] Исправление приоритета операторов при печати защит в
Exception.blame/3 - [File] Не генерировать исключение при возникновении конфликтов доступа к файловой системе в
File.cp/2 - [File] Не генерировать исключение при удалении пустых каталогов только для записи в
File.rm_rf/1 - [Kernel] Расширение макросов в левой части -> в
try/rescue - [Kernel] Вызывать исключение при некорректном
...внутри типовpec - [Kernel] Не импортировать функции
behaviour_infoиmodule_infoиз модулей Erlang - [Kernel] Вызывать исключение при предоставлении макросов в dialyzer
- [Kernel.ParallelCompiler] Обеспечение того, что компилятор не аварийно завершается при наличии «блуждающих» сообщений в очереди
- [Kernel.ParallelCompiler] Отслеживание предупреждений компиляции и времени выполнения отдельно
- [Module] Обеспечение того, что
Module.get_attribute/3возвращаетnilа не заданное значение по умолчанию, когда атрибут явно установлен какnil - [System] Исправление гонки при завершении скрипта до выполнения
System.stop/1 - [Task] Не дублировать сообщения об ошибках Task
- [URI] Убедиться, что
URI.merge/2работает корректно с относительными путями
ExUnit
- [ExUnit] Исправить сбой, когда
@tag capture_log: trueбыло установлено в значение true, а приложение Logger было закрыто посреди теста - [ExUnit] Не объединять контекст как теги внутри исполнителя, чтобы уменьшить использование памяти при отправке событий в форматеры
- [ExUnit] Отметить тестовые случаи как недействительные, когда происходит выход во время
setup_all - [ExUnit] Не расширять и не собирать переменные из строки в утверждениях ExUnit
- [ExUnit.DocTest] Обеспечить возвращение правильной строки при неудачной попытке парсинга результатов doctest
- [ExUnit.Doctest] Исправить информацию о строках, когда доктэст с несколькими утверждениями завершается неудачно
IEx
- [IEx] Не запускать процесс для чтения IO. Это исправляет ошибку, из-за которой многострочный ввод перестал работать, когда читатель ввода был убит
- [IEx] Не выполнять автодополнение для подсказок, вызываемых во время оценки кода
Mix
- [mix compile] Включить
cwdв ключе кэша компилятора - [mix release] Исправить службу Windows при вызове
erlsrv.exeв пути с пробелами - [mix xref] Вызвать ошибку раньше, если
mix xrefиспользуется в корневом узле
3. Мягкие устаревания (без вывода предупреждений)
Elixir
- [File]
File.cp/3иFile.cp_r/3с функцией в качестве третьего аргумента устарели в пользу списка ключевых слов - [Kernel] Требовать переменную pin при доступе к переменной внутри размера двоичного файла в совпадении
- [Kernel.ParallelCompiler] Требовать, чтобы опция
:return_diagnosticsбыла установлена в значение true при компиляции или требовании кода
Logger
- [Logger]
add_backend/2,remove_backend/2, иconfigure_backend/2устарели в пользу новой зависимости:logger_backends - [Logger] Настройка
:consoleустарела в пользу:default_formatter - [Logger] Настройка
:backendsустарела в пользуLogger.add_handlers/1
Mix
- [Mix.Project]
:preferred_cli_envустарело в пользу:preferred_envsвdef cli - [Mix.Project]
:preferred_cli_targetустарело в пользу:preferred_targetsвdef cli - [mix local] Переменная окружения
HEX_MIRRORустарела в пользуHEX_BUILDS_URL
4. Жёсткие устаревания
Elixir
- [Calendar]
Calendar.ISO.day_of_week/3устарело в пользуCalendar.ISO.day_of_week/4 - [Exception]
Exception.exception?/1устарело в пользуKernel.is_exception/1 - [Kernel] Устаревает
...как допустимый идентификатор вызова функции - [Regex]
Regex.regex?/1устарело в пользуKernel.is_struct/2
Logger
- [Logger]
Logger.warn/2устарело в пользуLogger.warning/2
v1.14
Список изменений для выпусков v1.14 можно найти в ветке v1.14.
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.15.4/changelog.html