移轉套件
本指南說明怎樣把帶有 tooth.json 的 lip v0.x 套件變成帶有 lip.toml 的套件,以及發佈之前要檢查什麼。
為 lip v0.37.0 及更早版本編寫的套件使用格式版本 1、2 或 3 的 tooth.json。現在的套件改用 lip.toml(參見 lip.toml)。lip 仍可安裝帶有這類 tooth.json 的套件,但你的套件的新版本應使用 lip.toml。lip pkg migrate 命令可幫助你完成轉換。
使用 lip pkg migrate
在套件儲存庫的根目錄(即包含 tooth.json 的目錄)中不帶參數執行 lip pkg migrate:
cd MyTool
lip pkg migrate
git add lip.toml tooth.json
git commit -m "Migrate tooth.json to lip.toml"它寫入由 tooth.json 轉換而來的 lip.toml,然後刪除 tooth.json。在介面中,工具頁的移轉 tooth.json 對目前工作區做同樣的事,並在介面中提問。lip.toml 已存在,或 tooth.json 不存在或不是 lip 能讀取的格式 1、2 或 3 的 tooth.json 時,命令會失敗,且不做任何修改。
詢問
lip.toml 沒有 RID 模式:每個條目只指定一個平臺,即一個 RID。當結果需要某個舊檔案未提供的值時,lip 會在終端機上詢問,直到回答有效為止:
tooth.json中win-*這樣的platform模式所代表的平臺(RID),以逗號分隔(每個都必須符合該模式);tooth.json中windows/amd64這樣不是 RID 的platform所代表的平臺(RID),以逗號分隔;- 沒有
platform的變體所適用的平臺(RID)(存在這類變體時)。
若標準輸入或標準錯誤不是終端機(例如在 CI 中),lip pkg migrate 會失敗,指明本應詢問的值,且不做任何修改。
警告
所有被丟棄或以不同含義轉換的內容都會以警告形式輸出,並指明其來源欄位,例如 variants (label '', win-x64).assets[1]。tooth.json 格式 1 和 2 的檔案會先被轉換為格式 3,因此欄位名按格式 3 給出。警告不會導致命令失敗;請檢查這些警告,按需修改 lip.toml,然後提交。
變化內容
format 為 4,tooth 變為 id,version 和 info 原樣複製,但 info.avatar_url 以 https:// 開頭時變為 info.logo,否則被丟棄並給出警告。變體按以下方式改寫:
- 每個標籤變為同名變體;空標籤變為變體
""。 - 對標籤適用的每個平臺(其各變體的
platform,模式和不是 RID 的值展開為你給出的 RID),該標籤下適用於該平臺的變體按 lip v0.37.0 的方式合併,結果變為該platform的一個條目。合併後的變體相依github.com/LiteLDev/LeviLamina#client時,其side為client;相依github.com/LiteLDev/LeviLamina的其他變體時,為server;不相依 LeviLamina 時,結果變為兩個條目,每個執行端各一個。 dependencies連同其範圍變為deps。現在無效的範圍會在終端機上詢問,直到回答是有效範圍;沒有終端機時命令失敗且不做任何變更。- 每個資源保留其
type和urls,其placements變為place,轉換方式與 lip 讀取早期格式的tooth.json完全相同:\取代為/、空段和.段被移除後,dir放置規則採用目錄形式(src和dest以/結尾,或為""),src含*、?或[的file放置規則採用 glob 形式(dest以/結尾,或為""),其他file放置規則採用檔案形式。在lip.toml中無效的放置規則會被省略,並給出警告。 lip.toml沒有tar、tgz和uncompressed資源類型。合併後的變體含有這類資源的平臺不會得到條目,並給出警告,這與 lip 在該平臺下不安裝其任何條目一致。preserve_files變為preserve,remove_files變為purge,其中的\取代為/;不含/的preserve_files模式加上前綴**/,不以/結尾的remove_files模式還會以帶結尾/的形式再寫一遍(參見侷限)。- scripts 變為
hooks:pre_install、post_install(先install,再post_install)、pre_uninstall(先pre_uninstall,再uninstall)和post_uninstall。 info之外的其他空值會被省略。
侷限
lip pkg migrate 只是輔助工具,不保證結果正確。請始終檢查其輸出。
lip.toml要求標籤處的version等於標籤版本,且儲存庫的id等於其路徑。lip v0.37.0 會安裝違反這些規則的tooth.json;發佈前請檢查你的檔案。- 放置規則按上述規則轉換,不檢視它們放置的檔案,隨後按
lip.toml的方式執行:src為模式的file放置規則會保留其符合檔案的子目錄,而tooth.json過去只按檔案名稱放置它們;放置缺失檔案的放置規則會使安裝失敗,而tooth.json過去會跳過它。請檢查這類放置規則。 - 不含
/的preserve_files模式過去會符合任意目錄中的檔案名稱;它會變為**/<pattern>。remove_files模式過去也會刪除符合的目錄;它還會以帶結尾/的形式再寫一遍。不是有效 glob 的模式(例如以/開頭的)會被丟棄。 - 格式 1 和 2 中版本範圍無法在格式 3 中讀取的相依(例如
2.16.x)在安裝tooth.json時本就會被忽略;lip 會報告它們,以便你手動新增。 - 安裝與解除安裝鉤子以外的指令碼(例如
pre_pack或自訂指令碼)以及格式 2 的prerequisites沒有對應項,會被丟棄。 - 移轉得到的套件是一個檔案套件,把檔案放到與舊
tooth.json相同的位置。如果你的套件是 LeviLamina 模組,可以考慮改為以mcmod資源發佈(參見模組套件),它會被安裝到mods/<name>/。 - 對其他仍帶有
tooth.json的套件的相依仍然有效,因為 lip 仍可安裝它們。
只有名稱恰為 v<SemVer> 的標籤(例如 v1.2.3)才是版本。v1.2 這樣的標籤不是版本。
移轉之後
-
閱讀警告,並在需要的地方修改
lip.toml。 -
檢查 lip 能否讀取轉換結果:
shlip pkg view . -
按本機測試所述,把它安裝到測試用的伺服器中。
-
提交,並按發佈版本所述用標籤發佈新版本。
你以前發佈的版本仍然帶著它們的 tooth.json,lip 會繼續安裝它們。
另請參閱
lip pkg migrate- lip.toml:lip 怎樣讀取
tooth.json。 - 建立套件
- 工具:介面中同樣的操作。