Совместимость и устаревшие функции
Elixir имеет версионирование по схеме vMAJOR.MINOR.PATCH.
В настоящее время Elixir находится на основной версии v1. Каждый 6 месяцев происходит новый обратный совместимый релиз с новой цифрой MINOR. Релизы с новой PATCH версией не планируются и выполняются при исправлениях багов и уязвимостей.
Elixir исправляет ошибки только в последней ветке MINOR. Исправления уязвимостей доступны для последних 5 веток MINOR:
| Версия Elixir | Поддержка |
|---|---|
| 1.7 | Исправление ошибок и уязвимостей |
| 1.6 | Только исправления уязвимостей |
| 1.5 | Только исправления уязвимостей |
| 1.4 | Только исправления уязвимостей |
| 1.3 | Только исправления уязвимостей |
Основные релизы Elixir могут содержать несовместимые изменения, и они будут явно указаны в CHANGELOG. В настоящее время нет планов на релиз с новой основной версией v2.
Совместимость между версиями Elixir без изменения основной версии
Релизы Elixir с новой цифрой MINOR и PATCH совместимы с предыдущими версиями: хорошо определенные поведения и документированные API в данной версии будут продолжать работать в будущих версиях.
Хотя мы ожидаем, что подавляющее большинство программ останется совместимым со временем, невозможно гарантировать, что никакое будущее изменение не сломает программу. В некоторых маловероятных случаях мы можем внести изменения, которые сломают существующий код:
-
Безопасность: может возникнуть проблема безопасности в реализации, решение которой потребует несовместимых с предыдущими версиями изменений. Мы оставляем за собой право устранять такие проблемы безопасности.
-
Ошибки: если у API есть нежелательное поведение, программа, которая зависит от этого ошибочного поведения, может сломаться, если ошибка будет исправлена. Мы оставляем за собой право исправлять такие ошибки.
-
Фронтенд компилятора: могут быть внесены улучшения в компилятор, добавление новых предупреждений для неоднозначных режимов и предоставление более подробных сообщений об ошибках. Это может привести к ошибкам компиляции (при запуске с
--warning-as-errors) или сбоям инструментов при утверждении конкретных сообщений об ошибках (хотя следует этого избегать). Мы оставляем за собой право вносить такие улучшения. -
Импорты: в модуль
Kernel, который автоматически импортируется, могут быть добавлены новые функции. Они могут вступать в конфликт с локальными функциями, определенными в ваших модулях. Конфликты могут быть разрешены обратным совместимым способом с помощьюimport Kernel, except: [...]со списком всех функций, которые вы не хотите импортировать изKernel. Мы оставляем за собой право добавлять такие функции.
Для продолжения развития языка без внесения несовместимых изменений Elixir будет полагаться на устаревание определенных практик и продвижение новых. Наша политика устаревания описана в разделе “Устаревшие функции”.
Единственным исключением из вышеперечисленных гарантий совместимости являются экспериментальные функции, которые будут явно отмечены как таковые, и не предоставляют никакой гарантии совместимости до тех пор, пока они не будут стабилизированы.
Совместимость между Elixir и Erlang/OTP
Версионирование Erlang/OTP независимо от версионирования Elixir. Каждая версия Elixir поддерживает определенный диапазон версий Erlang/OTP. Таблица совместимости показана ниже.
| Версия Elixir | Поддерживаемые версии Erlang/OTP |
|---|---|
| 1.0 | 17 - 17 (и Erlang/OTP 18 с v1.0.5) |
| 1.1 | 17 - 18 |
| 1.2 | 18 - 18 (и Erlang/OTP 19 с v1.2.6) |
| 1.3 | 18 - 19 |
| 1.4 | 18 - 19 (и Erlang/OTP 20 с v1.4.5) |
| 1.5 | 18 - 20 |
| 1.6 | 19 - 20 (и Erlang/OTP 21 с v1.6.6) |
| 1.7 | 19 - 21 |
Хотя Elixir часто добавляет совместимость с новыми версиями Erlang/OTP в релизах, таких как поддержка Erlang/OTP 20 в v1.4.5, эти релизы обычно содержат минимальные изменения для запуска Elixir без ошибок. Только следующий релиз MINOR, в данном случае v1.5.0, эффективно использует новые возможности, предоставленные последним релизом Erlang/OTP.
Устаревшие функции
Политика
Устаревание функций в Elixir происходит в 3 этапа:
-
Функция помечена как мягко устаревшая. Это означает, что в CHANGELOG и документации функция должна быть указана как устаревшая, но при запуске кода не выдается предупреждение. Требование мягкого устаревания функции отсутствует.
-
Функция считается фактически устаревшей, при использовании функции выдаются предупреждения. Это также известно как жесткое устаревание. Для устаревания функции предложенная альтернатива ДОЛЖНА существовать, по крайней мере, в течение двух версий MINOR. Например,
Enum.uniq/2была мягко устаревши, в пользуEnum.uniq_by/2в Elixir v1.1. Это означает, что предупреждение об устаревании может быть выдано только Elixir v1.3 или более поздней версии. -
Функция удаляется. Это может произойти только в основных релизах. Это означает, что устаревшие функции в Elixir v1.x будут удалены только в Elixir v2.x.
Таблица устаревших функций
:char_lists ключ в Inspect.Opts.t/0 типе |
v1.5 |
:charlists ключ (v1.3) |
:as_char_lists значение в Inspect.Opts.t/0 типе |
v1.5 |
:as_charlists значение (v1.3) |
@compile {:parse_transform, _} в Module
|
v1.5 | Нет |
EEx: <%= в выражениях посередине и в конце |
v1.5 | Используйте <% (<%= разрешено только в выражениях начала) (v1.0) |
Access.key/1 |
v1.4 |
Access.key/2 (v1.3) |
Behaviour модуль |
v1.4 |
@callback атрибут модуля (v1.0) |
Enum.uniq/2 |
v1.4 |
Enum.uniq_by/2 (v1.2) |
Float.to_char_list/2 |
v1.4 |
:erlang.float_to_list/2 (Erlang/OTP 17) |
Float.to_string/2 |
v1.4 |
:erlang.float_to_binary/2 (Erlang/OTP 17) |
HashDict модуль |
v1.4 |
Map (v1.2) |
HashSet модуль |
v1.4 |
MapSet (v1.1) |
Псевдонимы из нескольких букв в OptionParser
|
v1.4 | Используйте псевдонимы из одной буквы (v1.0) |
Set модуль |
v1.4 |
MapSet (v1.1) |
Stream.uniq/2 |
v1.4 |
Stream.uniq_by/2 (v1.2) |
IEx.Helpers.import_file/2 |
v1.4 |
IEx.Helpers.import_file_if_available/1 (v1.3) |
Mix.Utils.camelize/1 |
v1.4 |
Macro.camelize/1 (v1.2) |
Mix.Utils.underscore/1 |
v1.4 |
Macro.underscore/1 (v1.2) |
| Переменная, используемая как вызов функции | v1.4 | Используйте скобки (v1.0) |
Анонимные функции без выражения после ->
|
v1.4 | Используйте выражение или явно возвращайте nil (v1.0) |
| Поддержка превращения приватных функций в переопределяемые | v1.4 | Используйте публичные функции (v1.0) |
Dict модуль |
v1.3 |
Keyword (v1.0) или Map (v1.2) |
Keyword.size/1 |
v1.3 |
Kernel.length/1 (v1.0) |
Map.size/1 |
v1.3 |
Kernel.map_size/1 (v1.0) |
Set поведение |
v1.3 |
MapSet структура данных (v1.1) |
String.valid_character?/1 |
v1.3 |
String.valid?/1 (v1.0) |
Task.find/2 |
v1.3 | Используйте прямое соответствие сообщениям (v1.0) |
:append_first опция в Kernel.defdelegate/2
|
v1.3 | Определите функцию явно (v1.0) |
/r опция в Regex
|
v1.3 |
/U (v1.1) |
\x{X*} внутри строк/сигилов/списков символов |
v1.3 |
\uXXXX или \u{X*} (v1.1) |
Словарь или словарь как второй аргумент в Enum.group_by/3
|
v1.3 |
Enum.reduce/3 (v1.0) |
Не-словарь как второй аргумент в URI.decode_query/2
|
v1.3 | Используйте словарь (v1.0) |
Dict поведение |
v1.2 |
MapSet структура данных (v1.1) |
Access протокол |
v1.1 |
Access поведение (v1.1) |
as: true | false в alias/2 и require/2
|
v1.1 | Нет |
?\xHEX |
v1.1 |
0xHEX (v1.0) |
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.7.4/compatibility-and-deprecations.html