Spec-Zone.ru › Elixir 1.10

Совместимость и устаревание

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 этапа:

  1. Функция находится в состоянии мягкого устаревания. Это означает, что в CHANGELOG и документации функция должна быть указана как устаревшая, но при запуске кода никакого предупреждения не выдаётся. Нет требования к мягкому устареванию функции.

  2. Функция фактически устаревает, выдавая предупреждения при использовании. Это также известно как жёсткое устаревание. Для устаревания функции предлагаемая альтернатива ДОЛЖНА существовать В ТЕЧЕНИЕ МИНУМУ 3 незначительных версий. Например, Enum.uniq/2 была мягко устаревшей в пользу Enum.uniq_by/2 в Elixir v1.1. Это означает, что предупреждение об устаревании может быть выдано только Elixir v1.4 или более поздней версией.

  3. Функция удаляется. Это может произойти только в выпусках основных версий. Это означает, что устаревшие функции в 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
END_OF_DOCUMENT_MARKER
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

Spec-Zone.ru

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