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