廢棄、停用和移除公式

公式可能會被廢棄、停用或移除的原因有很多。本文件說明了每種方法之間的差異,以及說明何時應使用一種方法而非另一種方法。

概觀

可以遵循以下一般經驗法則

廢棄

如果使用者嘗試安裝已廢棄的公式,他們將會看到警告訊息,但安裝仍會繼續進行。

應廢棄一個公式以向使用者表明不應使用該公式,且將來會停用該公式。已廢棄的公式應繼續由 Homebrew 維護人員維護,以便它們仍能從原始碼建置,且其套件仍能正常運作(即使上游未維護)。如果這不可行,則應停用它們。

廢棄的最常見原因是上游專案已廢棄、未維護或已封存。

僅在符合下列至少一項條件時才應廢棄公式

具有依賴項的公式不應在所有依賴項也廢棄之前或同時廢棄。

若要廢棄公式,請新增 deprecate! 呼叫。此呼叫應包含廢棄日期(ISO 8601 格式)和廢棄原因

deprecate! date: "YYYY-MM-DD", because: :reason

應將 date 參數設為停用期間應開始的日期,通常是當天的日期。如果 date 參數設為未來的日期,公式將不會在該日期之前停用。如果上游開發人員已指出專案或版本將停止支援的日期,這項功能會很有用。請勿將 date 參數回溯,因為這會造成使用者和維護人員的混淆。

because 參數可以是預設原因 (使用符號) 或自訂原因。有關 because 參數的更多詳細資訊,請參閱下方的 停用和停用原因 區段。

停用

如果使用者嘗試安裝停用的公式,系統將會顯示錯誤訊息,而且安裝會失敗。

應停用公式,以告知使用者公式無法使用,而且未來將會移除。停用的公式可能無法再從來源建置,或沒有可用的瓶子。

停用公式最常見的原因如下

熱門公式 (例如在過去 90 天內有超過 1000 個 分析安裝),即使例如無法從來源建置且沒有授權,也不應在沒有至少六個月的停用期間的情況下停用。

不熱門的公式 (例如在過去 90 天內有少於 1000 個 分析安裝),可以立即停用,原因包括上述任何原因,例如無法在任何支援的 macOS 版本或 Linux 上從來源建置。它們可以在停用日期後三個月手動移除。

若要停用公式,請新增 disable! 呼叫。此呼叫應包含 ISO 8601 格式的停用日期和停用原因

disable! date: "YYYY-MM-DD", because: :reason

應將 date 參數設為停用原因生效的日期。如果沒有明確的日期,但需要停用公式,請使用當天的日期。如果 date 參數設為未來的日期,公式將會停用至該日期 (公式將在該日期停用)。

because 參數可以是預設原因 (使用符號) 或自訂原因。有關 because 參數的更多詳細資訊,請參閱下方的 停用和停用原因 區段。

移除

如果公式不符合我們對 可接受公式版本化公式 的標準、具有非開放原始碼授權,或已停用超過一年,則應移除該公式。

注意:已停用的 homebrew/core 公式將在停用日期後一年自動移除。

停用和禁用原因

當公式停用或禁用時,必須提供說明動作的原因。

有兩種方式表示原因。建議的方式是使用預先存在的符號表示原因。可用符號如下列出,並可在 DeprecateDisable 模組 中找到

這些原因可以用其符號指定(註解顯示將顯示給使用者的訊息)

# Warning: <formula> has been deprecated because it is deprecated upstream!
deprecate! date: "2020-01-01", because: :deprecated_upstream
# Error: <formula> has been disabled because it does not build!
disable! date: "2020-01-01", because: :does_not_build

如果這些預先存在的理由不適合,則可以指定自訂理由。此類理由應寫成符合句子 <formula> 已停用/禁用,因為它 <reason>!

自訂理由的範例寫法良好:

# Warning: <formula> has been deprecated because it fetches unversioned dependencies at runtime!
deprecate! date: "2020-01-01", because: "fetches unversioned dependencies at runtime"

一個表達不佳的客製化原因範例會是

# Error: <formula> has been disabled because it invalid license!
disable! date: "2020-01-01", because: "invalid license"
Fork me on GitHub