Spec-Zone.ru › Elixir 1.15

Журнал изменений для 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} в колбеках ExUnit setup
  • [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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API