跳到正文
本頁目錄

移轉套件

本指南說明怎樣把帶有 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:

sh
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 這樣的標籤不是版本。

移轉之後

  1. 閱讀警告,並在需要的地方修改 lip.toml。

  2. 檢查 lip 能否讀取轉換結果:

    sh
    lip pkg view .
  3. 按本機測試所述,把它安裝到測試用的伺服器中。

  4. 提交,並按發佈版本所述用標籤發佈新版本。

你以前發佈的版本仍然帶著它們的 tooth.json,lip 會繼續安裝它們。

另請參閱