Package.swift toolchain 版本的選擇

Package.swift toolchain 版本的選擇

由?王巍 (onevcat)?發(fā)布于?2020年9月5日

?最后更新:?2021年12月9日

WWDC 2020 上 Swift Package Manager (SPM) 開始支持?Resource bundle?和?Binary Framework。對于 Package 的維護者來說,如果有需求,當然是應(yīng)該盡快適配這些內(nèi)容。首先要做的,就是將 Package.swift 中的 Swift Toolchain 版本改到最新的 5.3:只有最新的 tool chain 才具備這些功能。

// swift-tools-version:5.3

但是,如果之前你就支持了 SPM 的話,直接在 Package.swift 文件上進行修改,會破壞舊版本的兼容性。比如 5.3 的 toolchain 是集成在 Xcode 12 中的,如果這樣改動以后,現(xiàn)有的使用 Xcode 11 的用戶由于 toolchain 版本過低,就無法再 build 這個 package,造成問題。

package at ‘xxx’ is using Swift tools version 5.3.0 but the installed version is 5.2.0

你不能假設(shè)用戶永遠都使用最新的版本,不顧兼容性的更新也會帶來嚴重的后果。那要如何讓一個 package 支持多個版本的 toolchain 呢?

Package.swift 文件后綴

你可能已經(jīng)看到過,有的項目中 (比如?PromiseKit) 會有多個 Package.swift 的聲明:它們帶有不同的后綴,比如?Package.swift,Package@swift-4.2.swift?或者?Package@swift-5.3.swift。SPM 在選取聲明文件時,會按照當前 toolchain 版本從新到舊,去選取最近的一個兼容版本的文件。舉個幾個例子,上面三個文件存在的情況下:

如果安裝了帶有 5.3 的 Xcode 12,則選取使用?Package@swift-5.3.swift;

如果運行環(huán)境是 5.1 的 Xcode 11,則跳過?Package@swift-5.3.swift?(由于不符合最低版本)。同時,由于不存在?Package@swift-5.1.swift?這一恰好兼容的版本,SPM 會向下尋找最近的一個兼容版本,即 轉(zhuǎn)而使用?Package@swift-4.2.swift。

如果 toolchain 版本甚至低于 4.2,那么所有帶有后綴的聲明文件都會被跳過,而去使用?Package.swift。

swift-tools-version

在選取了合適的 Package.swift 文件后,第一行的?swift-tools-version?注釋將會最終決定實際使用的 toolchain 版本。雖然沒有強制要求這個注釋指定的版本號必須和?Package@swift-x.y.swift?文件名中的版本號一致,但是選取不同的數(shù)字顯然會引起不必要的誤解。

那我該怎么做呢

因此,在添加 SPM 新版本支持的時候,正確的做法是:

創(chuàng)建 package 時,在?Package.swift?的首行中,聲明你的 package 所能支持的最低的 toolchain 版本。

保持現(xiàn)有的所有?Package.swift?和?Package@swift-a.b.swift?不變:這可以讓舊版本的 toolchain 繼續(xù)使用已有的 package 描述。

為新版本?x.y?添加?Package@swift-x.y.swift?文件,并在文件中首行將 toolchain 版本設(shè)置為同樣的版本,即?// swift-tools-version:x.y。然后為新版編寫合適的 package 聲明。

你可以通過切換 Xcode 中的 Command Line Tools 設(shè)定,并使用下面的命令來檢查當前設(shè)定下所被選用的 toolchain version。

$ swift package tools-version

確保每個組合都按照預(yù)想工作,就這么簡單。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容