Совместимость и устаревшие функции
Elixir имеет схему версионирования vMAJOR.MINOR.PATCH.
В настоящее время Elixir находится на основной версии v1. Каждый 6 месяцев выходит новая совместимая версия с меньшим номером. Выпуск исправлений не планируется и происходит при появлении исправлений ошибок или патчей безопасности.
Elixir применяет исправления ошибок только к последней ветке с меньшим номером. Патчи безопасности доступны для последних 5 веток с меньшим номером:
| Версия Elixir | Поддержка |
|---|---|
| 1.14 | Исправления ошибок и патчи безопасности |
| 1.13 | Только патчи безопасности |
| 1.12 | Только патчи безопасности |
| 1.11 | Только патчи безопасности |
| 1.10 | Только патчи безопасности |
О новых версиях объявляется в списке рассылки объявлений. Все релизы с исправлениями безопасности будут помечены с [security].
В настоящее время нет планов по выпуску основной версии v2.
Совместимость между версиями Elixir с одинаковым значением MAJOR
Версии Elixir с меньшим и исправленным номером являются обратной совместимыми: определённое поведение и документированные API в данной версии будут продолжать работать в будущих версиях.
Хотя мы ожидаем, что подавляющее большинство программ останется совместимым со временем, нельзя гарантировать, что какие-либо изменения в будущем не повредят ни одной программе. В некоторых маловероятных обстоятельствах мы можем внести изменения, которые повредят существующий код:
Безопасность: может возникнуть проблема безопасности в реализации, решение которой требует несовместимых изменений. Мы оставляем за собой право решать такие проблемы безопасности.
Ошибки: если у API есть нежелательное поведение, программа, зависящая от некорректного поведения, может сломаться при исправлении ошибки. Мы оставляем за собой право исправлять такие ошибки.
Фронтенд компилятора: могут быть внесены улучшения в компилятор, добавив новые предупреждения для неоднозначных режимов и предоставления более подробных сообщений об ошибках. Это может привести к ошибкам компиляции (при запуске с
--warning-as-errors) или сбоям инструментов при утверждении конкретных сообщений об ошибках (хотя следует избегать подобного). Мы оставляем за собой право на такие улучшения.Импорты: в модуль
Kernel, который импортируется автоматически, могут быть добавлены новые функции. Они могут конфликтовать с локальными функциями, определенными в ваших модулях. Конфликты могут быть разрешены обратной совместимым образом с использованиемimport Kernel, except: [...]со списком всех функций, которые вы не хотите импортировать изKernel. Мы оставляем за собой право на такие добавления.
Для дальнейшего развития языка без внесения несовместимых изменений Elixir будет полагаться на устаревшие функции, чтобы снизить использование определенных практик и поощрить новые. Наша политика устаревших функций изложена в разделе "Устаревшие функции".
Исключением из гарантий совместимости выше являются экспериментальные функции, которые будут явно отмечены как таковые и не предоставляют никакой гарантии совместимости до тех пор, пока не будут стабилизированы.
Совместимость между Elixir и Erlang/OTP
Версионирование Erlang/OTP независимо от версионирования Elixir. Erlang выпускает новую основную версию ежегодно. Наша цель состоит в том, чтобы поддерживать последние три основные версии Erlang к моменту выпуска Elixir. Таблица совместимости показана ниже.
| Версия Elixir | Поддерживаемые версии Erlang/OTP |
|---|
Elixir может добавлять совместимость с новыми версиями Erlang/OTP в патчах, таких как поддержка Erlang/OTP 20 в v1.4.5. Эти релизы созданы для удобства и, как правило, содержат минимальные изменения для работы Elixir без ошибок, если такие изменения необходимы. Только следующий выпуск с меньшим номером, в данном случае v1.5.0, фактически использует новые возможности, предоставляемые последней версией Erlang/OTP.
Устаревшие функции
Политика
Устаревание функций Elixir происходит в 3 этапа:
Функция мягко устаревает. Это означает, что в CHANGELOG и документации функция должна быть указана как устаревшая, но при выполнении кода не генерируется предупреждение. Нет требования к мягкому устареванию функции.
Функция эффективно устаревает путем выдачи предупреждений об использовании. Это также известно как жёсткое устаревание. Для того, чтобы устареть, предлагаемая альтернатива ДОЛЖНА существовать В ТЕЧЕНИИ МИНИМУМА ТРЕХ версий с меньшим номером. Например,
Enum.uniq/2была мягко устаревшей по отношению кEnum.uniq_by/2в Elixir v1.1. Это означает, что предупреждение об устаревании может быть выведено только Elixir v1.4 или более поздней версии.Функция удаляется. Это может произойти только в релизах с большей версией. Это означает, что устаревшие функции в Elixir v1.x должны быть удалены только в Elixir v2.x.
Таблица устаревших функций
Первый столбец - версия, в которой функция была жёстко устаревшей. Второй столбец кратко описывает устаревшую функцию, а третий столбец объясняет замену и с какой версии доступна замена.
| Версия | Устаревшая функция | Заменено на (доступно с) |
|---|---|---|
| v1.14 | use Bitwise |
import Bitwise (v1.0) |
| v1.14 | ~~~/1 |
bnot/2 (v1.0) |
| v1.14 |
Application.get_env/3 и аналогичные в теле модуля |
Application.compile_env/3 (v1.10) |
| v1.14 | Скомпилированные шаблоны в String.starts_with?/2
|
Передайте список строк вместо этого (v1.0) |
| v1.14 | Mix.Tasks.Xref.calls/1 |
Трассировщики компиляции (описанные в Code) (v1.10) |
| v1.14 |
$levelpad в Logger |
Нет |
| v1.14 |
<|> как пользовательский оператор |
Другой пользовательский оператор (v1.0) |
| v1.13 |
! и != в требованиях к версии |
~> или >= (v1.0) |
| v1.13 | Mix.Config |
Config (v1.9) |
| v1.13 |
:strip_beam конфигурация в mix escript.build
|
:strip_beams (v1.9) |
| v1.13 | Macro.to_string/2 |
Macro.to_string/1 (v1.0) |
| v1.13 | System.get_pid/0 |
System.pid/0 (v1.9) |
| v1.12 | ^^^/2 |
bxor/2 (v1.0) |
| v1.12 |
@foo() для чтения атрибутов модуля |
Удалите скобки (v1.0) |
| v1.12 | use EEx.Engine |
Явно делегируйте EEx.Engine вместо этого (v1.0) |
| v1.12 |
:xref компилятор в Mix |
Ничего (теперь он всегда работает как часть компилятора) |
| v1.11 | Mix.Project.compile/2 |
Mix.Task.run("compile", args) (v1.0) |
| v1.11 |
Supervisor.Spec.worker/3 и Supervisor.Spec.supervisor/3
|
Новые спецификации дочерних процессов, описанные в Supervisor (v1.5) |
| v1.11 |
Supervisor.start_child/2 и Supervisor.terminate_child/2
|
DynamicSupervisor (v1.6) |
| v1.11 | System.stacktrace/1 |
__STACKTRACE__ в try/catch/rescue (v1.7) |
| v1.10 | Code.ensure_compiled?/1 |
Code.ensure_compiled/1 (v1.0) |
| v1.10 | Code.load_file/2 |
Code.require_file/2 (v1.0) или Code.compile_file/2 (v1.7) |
| v1.10 | Code.loaded_files/0 |
Code.required_files/0 (v1.7) |
| v1.10 | Code.unload_file/1 |
Code.unrequire_files/1 (v1.7) |
| v1.10 | Передача не-chardata в Logger.log/2
|
Явно преобразуйте в строку с помощью to_string/1 (v1.0) |
| v1.10 |
:compile_time_purge_level в Logger среде приложения |
:compile_time_purge_matching в Logger среде приложения (v1.7) |
| v1.10 | Supervisor.Spec.supervise/2 |
Новые спецификации дочерних процессов, описанные в Supervisor (v1.5) |
| v1.10 |
:simple_one_for_one стратегия в Supervisor
|
DynamicSupervisor (v1.6) |
| v1.10 |
:restart и :shutdown в Task.Supervisor.start_link/1
|
:restart и :shutdown в Task.Supervisor.start_child/3 (v1.6) |
| v1.9 | Перечисляемые ключи в Map.drop/2, Map.split/2 и Map.take/2
|
Вызовите Enum.to_list/1 для второго аргумента заранее (v1.0) |
| v1.9 | Mix.Project.load_paths/1 |
Mix.Project.compile_path/1 (v1.0) |
| v1.9 | Передача :insert_replaced в String.replace/4
|
Используйте :binary.replace/4 (v1.0) |
| v1.8 | Передача непустого списка в Collectable.into/1
|
++/2 или Keyword.merge/2 (v1.0) |
| v1.8 | Передача непустого списка в :into в for/1
|
++/2 или Keyword.merge/2 (v1.0) |
| v1.8 | Передача непустого списка в Enum.into/2
|
++/2 или Keyword.merge/2 (v1.0) |
| v1.8 | Единицы времени во множественном числе, такие как: :seconds, :milliseconds, и тому подобное |
Используйте единственное число, такие как: :second, :millisecond, и так далее (v1.4) |
| v1.8 | Inspect.Algebra.surround/3 |
Inspect.Algebra.concat/2 и Inspect.Algebra.nest/2 (v1.0) |
| v1.8 | Inspect.Algebra.surround_many/6 |
Inspect.Algebra.container_doc/6 (v1.6) |
| v1.9 |
--detached в Kernel.CLI
|
--erl "-detached" (v1.0) |
| v1.8 | Kernel.ParallelCompiler.files/2 |
Kernel.ParallelCompiler.compile/2 (v1.6) |
| v1.8 | Kernel.ParallelCompiler.files_to_path/2 |
Kernel.ParallelCompiler.compile_to_path/2 (v1.6) |
| v1.8 | Kernel.ParallelRequire.files/2 |
Kernel.ParallelCompiler.require/2 (v1.6) |
| v1.8 | Возвращение {:ok, contents} или :error из обратного вызова Mix.Compilers.Erlang.compile/6 |
Возвращайте {:ok, contents, warnings} или {:error, errors, warnings} (v1.6) |
| v1.8 |
System.cwd/0 и System.cwd!/0
|
File.cwd/0 и File.cwd!/0 (v1.0) |
| v1.7 | Code.get_docs/2 |
Code.fetch_docs/1 (v1.7) |
| v1.7 | Enum.chunk/2,3,4 |
Enum.chunk_every/2 и Enum.chunk_every/3,4 (v1.5) |
| v1.7 | Вызов super/1 в обратных вызовах GenServer |
Явно реализуйте поведение без вызова super/1 (v1.0) |
| v1.7 | not left in right |
left not in right (v1.5) |
| v1.7 | Registry.start_link/3 |
Registry.start_link/1 (v1.5) |
| v1.7 | Stream.chunk/2,3,4 |
Stream.chunk_every/2 и Stream.chunk_every/3,4 (v1.5) |
| v1.6 | Enum.partition/2 |
Enum.split_with/2 (v1.4) |
| v1.6 | Macro.unescape_tokens/1,2 |
Используйте Enum.map/2 для обхода аргументов (v1.0) |
| v1.6 | Module.add_doc/6 |
@doc модуль атрибута (v1.0) |
| v1.6 | Range.range?/1 |
Сопоставление с образцом на _.._ (v1.0) |
| v1.5 |
() для обозначения nil
|
nil (v1.0) |
| v1.5 |
char_list/0 тип |
charlist/0 тип (v1.3) |
| v1.5 | Atom.to_char_list/1 |
Atom.to_charlist/1 (v1.3) |
| v1.5 | Enum.filter_map/3 |
Enum.filter/2 + Enum.map/2 или for/1 (v1.0) |
| v1.5 | Float.to_char_list/1 |
Float.to_charlist/1 (v1.3) |
| v1.5 |
GenEvent модуль |
Supervisor и GenServer (v1.0);<br/>GenStage (v1.3);<br/>:gen_event (Erlang/OTP 17) |
| v1.5 |
<%= в выражениях middle и end в EEx
|
Используйте <% (<%= разрешено только в стартовых выражениях) (v1.0) |
| v1.5 |
:as_char_lists значение в типе Inspect.Opts.t/0 |
:as_charlists значение (v1.3) |
| v1.5 |
:char_lists ключ в типе Inspect.Opts.t/0 |
:charlists ключ (v1.3) |
| v1.5 | Integer.to_char_list/1,2 |
Integer.to_charlist/1 и Integer.to_charlist/2 (v1.3) |
| v1.5 | to_char_list/1 |
to_charlist/1 (v1.3) |
| v1.5 | List.Chars.to_char_list/1 |
List.Chars.to_charlist/1 (v1.3) |
| v1.5 |
@compile {:parse_transform, _} в Module
|
Нет |
| v1.5 | Stream.filter_map/3 |
Stream.filter/2 + Stream.map/2 (v1.0) |
| v1.5 |
String.ljust/3 и String.rjust/3
|
Используйте String.pad_leading/3 и String.pad_trailing/3 с двоичным заполнением (v1.3) |
| v1.5 |
String.lstrip/1 и String.rstrip/1
|
String.trim_leading/1 и String.trim_trailing/1 (v1.3) |
| v1.5 |
String.lstrip/2 и String.rstrip/2
|
Используйте String.trim_leading/2 и String.trim_trailing/2 с двоичным значением во втором аргументе (v1.3) |
| v1.5 |
String.strip/1 и String.strip/2
|
String.trim/1 и String.trim/2 (v1.3) |
| v1.5 | String.to_char_list/1 |
String.to_charlist/1 (v1.3) |
| v1.4 |
Анонимные функции без выражения после ->
|
Используйте выражение или явно верните nil (v1.0) |
| v1.4 | Поддержка переопределения приватных функций | Используйте публичные функции (v1.0) |
| v1.4 | Переменная, используемая как вызов функции | Используйте скобки (v1.0) |
| v1.4 | Access.key/1 |
Access.key/2 (v1.3) |
| v1.4 |
Behaviour модуль |
@callback атрибут модуля (v1.0) |
| v1.4 | Enum.uniq/2 |
Enum.uniq_by/2 (v1.2) |
| v1.4 | Float.to_char_list/2 |
:erlang.float_to_list/2 (Erlang/OTP 17) |
| v1.4 | Float.to_string/2 |
:erlang.float_to_binary/2 (Erlang/OTP 17) |
| v1.4 |
HashDict модуль |
Map (v1.2) |
| v1.4 |
HashSet модуль |
MapSet (v1.1) |
| v1.4 | IEx.Helpers.import_file/2 |
IEx.Helpers.import_file_if_available/1 (v1.3) |
| v1.4 | Mix.Utils.camelize/1 |
Macro.camelize/1 (v1.2) |
| v1.4 | Mix.Utils.underscore/1 |
Macro.underscore/1 (v1.2) |
| v1.4 | Многобуквенные алиасы в OptionParser
|
Используйте однобуквенные алиасы (v1.0) |
| v1.4 |
Set модуль |
MapSet (v1.1) |
| v1.4 | Stream.uniq/2 |
Stream.uniq_by/2 (v1.2) |
| v1.3 |
\x{X*} внутри строк/сигилов/списков символов |
\uXXXX или \u{X*} (v1.1) |
| v1.3 |
Dict модуль |
Keyword (v1.0) или Map (v1.2) |
| v1.3 |
:append_first опция в defdelegate/2
|
Определите функцию явно (v1.0) |
| v1.3 | Карта/словарь как второй аргумент в Enum.group_by/3
|
Enum.reduce/3 (v1.0) |
| v1.3 | Keyword.size/1 |
length/1 (v1.0) |
| v1.3 | Map.size/1 |
map_size/1 (v1.0) |
| v1.3 |
/r опция в Regex
|
/U (v1.1) |
| v1.3 |
Set поведение |
MapSet структура данных (v1.1) |
| v1.3 | String.valid_character?/1 |
String.valid?/1 (v1.0) |
| v1.3 | Task.find/2 |
Использование прямого сопоставления сообщений (v1.0) |
| v1.3 | Не-карта в качестве 2-го аргумента в URI.decode_query/2
|
Использование карты (v1.0) |
| v1.2 |
Dict поведение |
Map и Keyword (v1.0) |
| v1.1 | ?\xHEX |
0xHEX (v1.0) |
| v1.1 |
Access протокол |
Access поведение (v1.1) |
| v1.1 |
as: true | false в alias/2 и require/2
|
Ничего |
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.14.1/compatibility-and-deprecations.html