檢視原始碼 Elixir v1.16 的變更記錄
診斷中的程式碼片段
Elixir v1.15 引進新的編譯器診斷格式,以及在編譯時列印多個錯誤診斷(除了多個警告)的能力。
在 Elixir v1.16 中,我們也包含編譯器引發的例外和診斷中的程式碼片段。例如,語法錯誤現在包含指向錯誤發生位置的指標
** (SyntaxError) invalid syntax found on lib/my_app.ex:1:17:
error: syntax error before: '*'
│
1 │ [1, 2, 3, 4, 5, *]
│ ^
│
└─ lib/my_app.ex:1:17
對於不匹配的區隔符號,現在會顯示兩個區隔符號
** (MismatchedDelimiterError) mismatched delimiter found on lib/my_app.ex:1:18:
error: unexpected token: )
│
1 │ [1, 2, 3, 4, 5, 6)
│ │ └ mismatched closing delimiter (expected "]")
│ └ unclosed delimiter
│
└─ lib/my_app.ex:1:18
對於未關閉的區隔符號,現在會顯示未關閉的區隔符號開始的位置
** (TokenMissingError) token missing on lib/my_app:8:23:
error: missing terminator: )
│
1 │ my_numbers = (1, 2, 3, 4, 5, 6
│ └ unclosed delimiter
...
8 │ IO.inspect(my_numbers)
│ └ missing closing delimiter (expected ")")
│
└─ lib/my_app:8:23
錯誤和警告診斷也包含程式碼片段。如果可能,我們會顯示精確的範圍,例如未定義的變數
error: undefined variable "unknown_var"
│
5 │ a - unknown_var
│ ^^^^^^^^^^^
│
└─ lib/sample.ex:5:9: Sample.foo/1
否則整行會加上底線
error: function names should start with lowercase characters or underscore, invalid name CamelCase
│
3 │ def CamelCase do
│ ^^^^^^^^^^^^^^^^
│
└─ lib/sample.ex:3
非常感謝 Vinícius Müller 致力於新的診斷。
改進的文件
Elixir 的入門指南已成為 Elixir 儲存庫的一部分,並整合到 ExDoc 中。這是重新檢視和統一所有官方指南和參考的機會。
我們也整合並擴充了 了解 Elixir 函數式語言中的程式碼異味,作者為 ASERG/DCC/UFMG 的 Lucas Vegi 和 Marco Tulio Valente,以反模式的形式納入官方文件。反模式分為四類:與程式碼相關、與設計相關、與流程相關,以及元程式設計。我們的目標是提供所有開發人員潛在反模式的範例,並提供改善程式碼庫的背景和範例。
我們在此版本中整合的另一個 ExDoc 功能是加入備忘單,從 Enum 模組的備忘單 開始。如果您想為 Elixir 本身貢獻未來的備忘單,請隨時開始討論問題。
最後,我們已開始使用 Mermaid.js 圖表豐富我們的文件。您可以在 GenServer 和 Supervisor 文件中找到範例。
v1.16.2 (2024-03-10)
1. 增強功能
Elixir
- [Code] 在模組定義中發出
:defmodule
追蹤事件
Mix
- [Mix] 新增
Mix.install_project_dir/0
- [Mix] 新增環境變數,用於重複使用
Mix.install/2
安裝 - [Mix.SCM] 新增
Mix.SCM.delete/1
2. 錯誤修正
Elixir
- [Code] 修復單引號字元清單在跳脫雙引號字元時發生的格式化問題
- [Path] 修復
Path.relative_to/2
處理輸入為「.」時的回歸問題
IEx
- [IEx.Helpers] 從 ansi 文件中捨棄 mermaid 圍欄區塊
ExUnit
- [ExUnit] 在建立差異時正確比較已固定的值
v1.16.1 (2024-01-31)
1. 錯誤修正
Elixir
- [Code] 修復
Code.quoted_to_algebra/2
中使用 :do 鍵作為運算元的運算子 - [Kernel.ParallelCompiler] 當從額外的程式碼評估中收到診斷時,不要讓平行編譯器崩潰
- [Kernel.ParallelCompiler] 編譯結束時總是記錄錯誤
- [String] 修復
String.capitalize/1
處理單一碼點的問題
IEx
- [IEx] 修復在 Erlang/OTP 26 上自動完成函式簽章
- [IEx] 不要假設
$HOME
已設定
Mix
- [mix deps.compile] 在 Unix 上的 rebar3 路徑包含空格時,處理 rebar3 相依項目的編譯
- [mix test] 從個別檔案執行測試時,正確解析相對路徑
- [mix test] 從個別檔案執行測試時,正確解析 Windows 路徑
v1.16.0 (2023-12-22)
1. 增強功能
EEx
- [EEx] 在診斷中包含相關檔案資訊
Elixir
- [Code] 為
Code.string_to_quoted/2
新增:emit_warnings
- [Code] 自動在剖析選項中包含欄位
- [Code] 引入
MismatchedDelimiterError
來處理不匹配分隔符例外 - [Code.Fragment] 處理片段中的匿名呼叫
- [Code.Formatter] 修剪使用
\r\n
的 here 文件尾端空白 - [File] 為
File.stream!/2
新增:offset
選項 - [Kernel] 自動推斷位元串中匹配變數的大小
- [Kernel] 翻譯類型規格時保留欄位資訊
- [Kernel] 當模組在
UndefinedFunctionError
中不存在時,根據後綴和大小寫錯誤建議模組名稱 - [Kernel.ParallelCompiler] 引入
Kernel.ParallelCompiler.pmap/2
來平行編譯多個額外條目 - [Kernel.SpecialForms] 如果
True
/False
/Nil
被用作別名,且沒有這樣的別名,則發出警告 - [Macro] 新增
Macro.compile_apply/4
- [Module] 新增對 Erlang/OTP 25 中
@nifs
註解的支持 - [Module] 新增對遺失的
@dialyzer
組態的支持 - [String] 更新至 Unicode 15.1.0
- [String] 新增
String.replace_invalid/2
- [Task] 為
Task.yield_many/2
新增:limit
選項
Logger
- [Logger] 新增
Logger.levels/0
Mix
- [mix] 新增
MIX_PROFILE
來設定一串以逗號分隔的任務 - [mix archive.install] 支援
--sparse
選項 - [mix compile.app] 如果同時使用
:applications
和:extra_applications
,則發出警告 - [mix compile.elixir] 如果可能,將原始例外傳遞至診斷
:details
- [mix compile.elixir] 優化
lib/
中有數千個檔案且其中一個檔案已變更的場景 - [mix deps.clean] 當無法移除依賴項時,發出警告而不是崩潰
- [mix escript.build] 預設情況下,escript 現在會移除 .beam 檔案,這會產生較小的 escript。但是,如果您使用 escript 存取 Elixir 文件或編譯 Elixir 程式碼,則文件和不建議使用元資料將不再可用。在
mix.exs
中的 escript 組態中設定strip_beams: false
以保留所有元資料 - [mix escript.install] 支援
--sparse
選項 - [mix 發行] 在發行中包含
include/
目錄 - [mix 測試] 允許同時測試多個檔案:行,例如
mix test test/foo_test.exs:13 test/bar_test.exs:27
2. 錯誤修正
Elixir
- [程式碼] 保留格式化程式中原子鍵的引號
- [程式碼片段] 修正
Code.Fragment.surround_context/2
在與->
匹配時崩潰的問題 - [IO] 在終止裝置上使用
IO.binwrite/2
時引發錯誤(鏡像IO.write/2
) - [核心] 不要遞迴展開別名(儲存在巨集環境中的別名已經展開)
- [核心] 確保
dbg
模組是編譯時相依性 - [核心] 當私有函式或巨集使用
unquote/1
且函式/巨集本身未被使用時發出警告 - [核心] 重新啟用腳本中頂層函式的編譯器最佳化(在 v1.14.0 中停用,但不應影響大多數程式)
- [核心] 不要定義在定義中以
Elixir.
開頭的巢狀模組的別名 - [核心平行編譯器] 考慮在
@after_compile
回呼中定義模組,以避免死結 - [巨集] 針對特定 AST 解決
Macro.to_string/1
的例外 - [路徑] 在
File.cwd!/0
、Path.expand/1
和Path.absname/1
中延遲評估 - [路徑] 確保當給定的引數與
cwd
沒有共用前置字元時,Path.relative_to/2
會傳回相對路徑
ExUnit
- [ExUnit] 對縮排錯誤的文件測試引發錯誤
IEx
- [IEx.Pry] 修復主體中只有文字的窺探函式
Mix
- [mix archive.install] 在
mix archive.install
之後還原程式碼路徑 - [mix 編譯] 確保每當任何檔案變更時,都會重新編譯具有重複模組的檔案
- [mix 編譯] 更新 Mix 編譯器診斷文件和類型規範,以符合 Elixir 編譯器行為,其中行和欄都從 1 開始(之前錯誤地說欄從 0 開始)
- [mix escript.install] 在
mix escript.install
之後還原程式碼路徑
3. 軟性棄用(不發出警告)
Elixir
- [File] 棄用
File.stream!(file, options, line_or_bytes)
,改用將選項作為最後一個參數,如File.stream!(file, line_or_bytes, options)
- [Kernel.ParallelCompiler] 棄用
Kernel.ParallelCompiler.async/1
,改用Kernel.ParallelCompiler.pmap/2
- [Path] 棄用
Path.safe_relative_to/2
,改用Path.safe_relative/2
Mix
- [mix compile] 傳回四元素元組作為
Mix.Task.Compiler.Diagnostic
中的位置
4. 硬性棄用
Elixir
- [Date] 棄用推論具有負步長的範圍,改用
Date.range/3
搭配負步長 - [Enum] 棄用在
Enum.slice/2
上傳遞具有負步長的範圍,改用first..last//1
- [Kernel]
~R/.../
已棄用,改用~r/.../
。這是因為~R/.../
仍允許跳脫碼,這不符合大寫符號的定義 - [String] 棄用在
String.slice/2
上傳遞具有負步長的範圍,改用first..last//1
ExUnit
- [ExUnit.Formatter] 棄用
format_time/2
,改用format_times/1
Mix
- [mix compile.leex] 要求將
:leex
新增為編譯器,才能執行leex
編譯器 - [mix compile.yecc] 要求將
:yecc
新增為編譯器,才能執行yecc
編譯器
v1.15
v1.15 版本的 CHANGELOG 可在 v1.15 分支中找到。