檢視原始碼 相容性和棄用

Elixir 版本依據 vMAJOR.MINOR.PATCH 架構。

Elixir 目前為主要版本 v1。每 6 個月會推出一個向後相容的小版本。修補版本沒有排程,會在有錯誤修正或安全性修補時推出。

Elixir 僅對最新小版本套用錯誤修正。安全性修補適用於最後 5 個小版本

Elixir 版本支援
1.16錯誤修正和安全性修補
1.15僅安全性修補
1.14僅安全性修補
1.13僅安全性修補
1.12僅安全性修補

新版本會在唯讀的 公告郵件清單 中公告。所有安全性版本 都會標記為 [security]

目前沒有主要 v2 版本的計畫。

非主要 Elixir 版本之間

Elixir 小版本和修補版本向後相容:在特定版本中定義良好的行為和文件化 API 會持續在未來版本中運作。

雖然我們預期絕大多數程式會持續相容,但無法保證未來變更不會中斷任何程式。在一些不太可能的情況下,我們可能會引入中斷現有程式碼的變更

  • 安全性:實作中可能會出現安全性問題,而解決方案需要向後不相容的變更。我們保留處理此類安全性問題的權利。

  • 錯誤:如果 API 有不想要的行為,依賴錯誤行為的程式可能會在錯誤修正後中斷。我們保留修正此類錯誤的權利。

  • 編譯器前端:可能會對編譯器進行改善,為模稜兩可的模式引入新的警告,並提供更詳細的錯誤訊息。這些可能會導致編譯錯誤(在使用 --warning-as-errors 執行時),或在特定錯誤訊息上斷言時導致工具失敗(雖然應該避免這樣做)。我們保留進行此類改善的權利。

  • 匯入:可能會將新的函式新增至 Kernel 模組,此模組會自動匯入。它們可能會與模組中定義的區域函式發生衝突。衝突可以使用 import Kernel, except: [...] 以向後相容的方式解決,其中清單列出所有不想從 Kernel 匯入的函式。我們保留進行此類新增的權利。

為了持續進化語言而不引入破壞性變更,Elixir 將依賴於棄用來降級某些實務並推廣新的實務。我們的棄用政策在 「棄用」區塊 中概述。

上述相容性保證的唯一例外是實驗性功能,這些功能會明確標示為實驗性功能,且在穩定之前不提供任何相容性保證。

Elixir 和 Erlang/OTP 之間

Erlang/OTP 版本控管獨立於 Elixir 的版本控管。Erlang 每年發布一個新的主要版本。我們的目標是在 Elixir 發布時支援最後三個 Erlang 主要版本。相容性表格如下所示。

Elixir 版本支援的 Erlang/OTP 版本
1.1624 - 26
1.1524 - 26
1.1423 - 25(以及 v1.14.5 起的 Erlang/OTP 26)
1.1322 - 24(以及 v1.13.4 起的 Erlang/OTP 25)
1.1222 - 24
1.1121 - 23(以及 v1.11.4 起的 Erlang/OTP 24)
1.1021 - 22(以及 v1.10.3 起的 Erlang/OTP 23)
1.920 - 22
1.820 - 22
1.719 - 22
1.619 - 20(以及 v1.6.6 起的 Erlang/OTP 21)
1.518 - 20
1.418 - 19(以及 v1.4.5 起的 Erlang/OTP 20)
1.318 - 19
1.218 - 18(以及 v1.2.6 起的 Erlang/OTP 19)
1.117 - 18
1.017 - 17(以及 v1.0.5 起的 Erlang/OTP 18)

Elixir 可以在修補程式版本中新增與新 Erlang/OTP 版本的相容性,例如在 v1.4.5 中支援 Erlang/OTP 20。這些版本是為了方便而製作,且通常包含 Elixir 在沒有錯誤的情況下執行的最小變更(如果需要變更的話)。只有下一個次要版本(在本例中為 v1.5.0)才能有效利用最新 Erlang/OTP 版本提供的全新功能。

棄用

政策

Elixir 棄用分為 3 個步驟

  1. 功能已軟棄用。這表示 CHANGELOG 和文件都必須將該功能列為已棄用,但執行程式碼時不會實際發出警告。沒有軟棄用功能的要求。

  2. 透過在使用時發出警告,該功能已實際棄用。這也稱為硬棄用。為了棄用某個功能,建議的替代方案必須存在於至少三個次要版本中。例如,Enum.uniq/2 在 Elixir v1.1 中已軟棄用,並建議使用 Enum.uniq_by/2。這表示只有 Elixir v1.4 或更新版本才會發出棄用警告。

  3. 該功能已移除。這只能在主要版本中發生。這表示 Elixir v1.x 中的已棄用功能只能由 Elixir v2.x 移除。

棄用表格

第一欄是該功能已硬棄用的版本。第二欄簡短描述已棄用的功能,第三欄說明替換方案,以及替換方案可用的版本。

版本已棄用功能已取代(自版本)
v1.16~R/.../~r/.../ (v1.0)
v1.16Enum.slice/2 中使用負步長的範圍範圍中的明確步長 (v1.11)
v1.16String.slice/2 中使用負步長的範圍範圍中的明確步長 (v1.11)
v1.15Calendar.ISO.day_of_week/3Calendar.ISO.day_of_week/4 (v1.11)
v1.15Exception.exception?/1Kernel.is_exception/1 (v1.11)
v1.15Regex.regex?/1Kernel.is_struct/2 (Kernel.is_struct(term, Regex)) (v1.11)
v1.15Logger.warn/2Logger.warning/2 (v1.11)
v1.14使用 Bitwiseimport Bitwise (v1.0)
v1.14~~~/1bnot/2 (v1.0)
v1.14Application.get_env/3 和模組主體中類似的函式Application.compile_env/3 (v1.10)
v1.14String.starts_with?/2 中編譯模式改為傳遞字串清單 (v1.0)
v1.14Mix.Tasks.Xref.calls/1編譯追蹤器(在 Code 中概述)(v1.10)
v1.14$levelpad 在 Logger 中
v1.14<|> 作為自訂運算子另一個自訂運算子 (v1.0)
v1.13!!= 在版本需求中~>>= (v1.0)
v1.13Mix.ConfigConfig (v1.9)
v1.13:strip_beam 設定至 mix escript.build:strip_beams (v1.9)
v1.13Macro.to_string/2Macro.to_string/1 (v1.0)
v1.13System.get_pid/0System.pid/0 (v1.9)
v1.12^^^/2bxor/2 (v1.0)
v1.12@foo() 來讀取模組屬性移除括號 (v1.0)
v1.12使用 EEx.Engine改為明確委派至 EEx.Engine (v1.0)
v1.12:xref 編譯器在 Mix 中無(它現在總是作為編譯器的一部分執行)
v1.11Mix.Project.compile/2Mix.Task.run("compile", args) (v1.0)
v1.11Supervisor.Spec.worker/3Supervisor.Spec.supervisor/3Supervisor 中概述的新子規格 (v1.5)
v1.11Supervisor.start_child/2Supervisor.terminate_child/2DynamicSupervisor (v1.6)
v1.11System.stacktrace/1__STACKTRACE__ in try/catch/rescue (v1.7)
v1.10Code.ensure_compiled?/1Code.ensure_compiled/1 (v1.0)
v1.10Code.load_file/2Code.require_file/2 (v1.0) or Code.compile_file/2 (v1.7)
v1.10Code.loaded_files/0Code.required_files/0 (v1.7)
v1.10Code.unload_file/1Code.unrequire_files/1 (v1.7)
v1.10傳遞非字元資料給 Logger.log/2使用 to_string/1 明確轉換成字串 (v1.0)
v1.10:compile_time_purge_level in Logger 應用程式環境:compile_time_purge_matching in Logger 應用程式環境 (v1.7)
v1.10Supervisor.Spec.supervise/2Supervisor 中概述的新子規格 (v1.5)
v1.10:simple_one_for_one strategy in SupervisorDynamicSupervisor (v1.6)
v1.10:restart:shutdown in Task.Supervisor.start_link/1:restart:shutdown in Task.Supervisor.start_child/3 (v1.6)
v1.9可列舉的 key in Map.drop/2Map.split/2Map.take/2先對第二個參數呼叫 Enum.to_list/1 (v1.0)
v1.9Mix.Project.load_paths/1Mix.Project.compile_path/1 (v1.0)
v1.9傳遞 :insert_replacedString.replace/4使用 :binary.replace/4 (v1.0)
v1.8傳遞非空清單給 Collectable.into/1++/2Keyword.merge/2 (v1.0)
v1.8傳遞非空清單給 :into in for/1++/2Keyword.merge/2 (v1.0)
v1.8傳遞非空清單給 Enum.into/2++/2Keyword.merge/2 (v1.0)
v1.8時間單位使用複數形式,例如::seconds:milliseconds使用單數形式,例如::second:millisecond 等 (v1.4)
v1.8Inspect.Algebra.surround/3Inspect.Algebra.concat/2Inspect.Algebra.nest/2(v1.0)
v1.8Inspect.Algebra.surround_many/6Inspect.Algebra.container_doc/6(v1.6)
v1.9--detachedKernel.CLI--erl "-detached"(v1.0)
v1.8Kernel.ParallelCompiler.files/2Kernel.ParallelCompiler.compile/2(v1.6)
v1.8Kernel.ParallelCompiler.files_to_path/2Kernel.ParallelCompiler.compile_to_path/2(v1.6)
v1.8Kernel.ParallelRequire.files/2Kernel.ParallelCompiler.require/2(v1.6)
v1.8Mix.Compilers.Erlang.compile/6 的回呼傳回 {:ok, contents}:error傳回 {:ok, contents, warnings}{:error, errors, warnings}(v1.6)
v1.8System.cwd/0System.cwd!/0File.cwd/0File.cwd!/0(v1.0)
v1.7Code.get_docs/2Code.fetch_docs/1(v1.7)
v1.7Enum.chunk/2,3,4Enum.chunk_every/2Enum.chunk_every/3,4(v1.5)
v1.7GenServer 回呼中呼叫 super/1明確實作行為而不呼叫 super/1(v1.0)
v1.7not left in rightleft not in right(v1.5)
v1.7Registry.start_link/3Registry.start_link/1(v1.5)
v1.7Stream.chunk/2,3,4Stream.chunk_every/2Stream.chunk_every/3,4(v1.5)
v1.6Enum.partition/2Enum.split_with/2(v1.4)
v1.6Macro.unescape_tokens/1,2使用 Enum.map/2 遍歷參數(v1.0)
v1.6Module.add_doc/6@doc 模組屬性(v1.0)
v1.6Range.range?/1模式比對 _.._(v1.0)
v1.5() 表示 nilnil (v1.0)
v1.5char_list/0 類型charlist/0 類型 (v1.3)
v1.5Atom.to_char_list/1Atom.to_charlist/1 (v1.3)
v1.5Enum.filter_map/3Enum.filter/2 + Enum.map/2for/1 理解 (v1.0)
v1.5Float.to_char_list/1Float.to_charlist/1 (v1.3)
v1.5GenEvent 模組SupervisorGenServer (v1.0);<br/>GenStage (v1.3);<br/>:gen_event (Erlang/OTP 17)
v1.5<%=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.5Integer.to_char_list/1,2Integer.to_charlist/1Integer.to_charlist/2 (v1.3)
v1.5to_char_list/1to_charlist/1 (v1.3)
v1.5List.Chars.to_char_list/1List.Chars.to_charlist/1 (v1.3)
v1.5@compile {:parse_transform, _}Module
v1.5Stream.filter_map/3Stream.filter/2 + Stream.map/2 (v1.0)
v1.5String.ljust/3String.rjust/3使用 String.pad_leading/3String.pad_trailing/3 搭配二進位填充 (v1.3)
v1.5String.lstrip/1String.rstrip/1String.trim_leading/1String.trim_trailing/1 (v1.3)
v1.5String.lstrip/2String.rstrip/2使用 String.trim_leading/2String.trim_trailing/2 搭配二進位作為第二個參數 (v1.3)
v1.5String.strip/1String.strip/2String.trim/1String.trim/2 (v1.3)
v1.5String.to_char_list/1String.to_charlist/1 (v1.3)
v1.4沒有表達式的匿名函數,在 -> 之後使用表達式或明確回傳 nil (v1.0)
v1.4支援讓 私有函數 可被覆寫使用 公開函數 (v1.0)
v1.4變數用作函數呼叫使用括號 (v1.0)
v1.4Access.key/1Access.key/2 (v1.3)
v1.4Behaviour 模組@callback 模組屬性 (v1.0)
v1.4Enum.uniq/2Enum.uniq_by/2 (v1.2)
v1.4Float.to_char_list/2:erlang.float_to_list/2 (Erlang/OTP 17)
v1.4Float.to_string/2:erlang.float_to_binary/2 (Erlang/OTP 17)
v1.4HashDict 模組Map (v1.2)
v1.4HashSet 模組MapSet (v1.1)
v1.4IEx.Helpers.import_file/2IEx.Helpers.import_file_if_available/1 (v1.3)
v1.4Mix.Utils.camelize/1Macro.camelize/1 (v1.2)
v1.4Mix.Utils.underscore/1Macro.underscore/1 (v1.2)
v1.4OptionParser 中的多字母別名使用單字母別名 (v1.0)
v1.4Set 模組MapSet (v1.1)
v1.4Stream.uniq/2Stream.uniq_by/2 (v1.2)
v1.3\x{X*} 在字串/符號/字元清單中\uXXXX\u{X*} (v1.1)
v1.3Dict 模組Keyword (v1.0) 或 Map (v1.2)
v1.3:append_first 選項在 defdelegate/2明確定義函數 (v1.0)
v1.3Enum.group_by/3 中,第二個參數是 Map/字典Enum.reduce/3 (v1.0)
v1.3Keyword.size/1length/1 (v1.0)
v1.3Map.size/1map_size/1 (v1.0)
v1.3/r 選項在 Regex/U (v1.1)
v1.3Set 行為MapSet 資料結構 (v1.1)
v1.3String.valid_character?/1String.valid?/1 (v1.0)
v1.3Task.find/2使用直接訊息比對 (v1.0)
v1.3URI.decode_query/2 中將非映射作為第 2 個參數使用映射 (v1.0)
v1.2Dict 行為MapKeyword (v1.0)
v1.1?\xHEX0xHEX (v1.0)
v1.1Access 協定Access 行為 (v1.1)
v1.1as: true | falsealias/2require/2