跳到正文
本頁目錄

遷移包

lip 包過去由 tooth.json(格式版本 1 到 3)描述,現在由 manifest.json(格式版本 4,參見包清單)描述。lip 仍可安裝 tooth.json 包,但你的包的新版本應使用 manifest.json。lip migrate 命令可幫助你完成轉換。

使用 lip migrate

在包倉庫的根目錄(即包含 tooth.json(格式 1、2 或 3)的目錄)中不帶參數運行 lip migrate:

sh
cd MyTool
lip migrate
git add -A
git commit -m "Migrate to manifest.json"

它按下文所述把 tooth.json 轉換為 manifest.json,寫入 manifest.json,然後刪除 tooth.json(歸檔同時含有兩者時,lip 讀取的是 tooth.json,所以必須刪除它)。只有在 manifest.json 寫入成功後才會刪除 tooth.json。如果當前目錄中沒有 tooth.json,命令會失敗,且不做任何修改。

所有無法用 manifest.json 表達或需要你決定的事項都會以警告形式輸出,並指明相關的 tooth.json 字段,例如 variants[0].preserve_files。格式 1 和 2 的文件會先被轉換為格式 3,因此字段名按格式 3 給出。警告不會導致命令失敗;請檢查這些警告,按需修改 manifest.json,然後提交。

已有的 manifest.json

許多倉庫已經有 manifest.json,例如 mod 的 LeviLamina 清單。lip migrate 會合並進該文件,而不是替換它:

  • 文件中還沒有的鍵會按轉換後的順序、以該文件自身的縮進和換行符追加到對象末尾,其中包括格式標記 formatVersion 和 formatUuid。
  • 文件中已有的鍵絕不會被覆蓋。若已有值與轉換得到的值不同,lip 會輸出一條包含兩個值的警告。
  • 文件的其餘內容(包括鍵的順序和格式)保持不變。

隨後 lip 會檢查合併後的文件;如果它還不是有效的 manifest.json,會給出警告。例如,LeviLamina mod 模板中 version 是 "${modVersion}" 這樣的構建佔位符時就會如此:路由文檔的 version 必須是 SemVer 版本,並且與其發佈時的標籤相同。發佈前請把這類佔位符替換為實際值,或把構建模板移到別處。

遷移邏輯

name 取自 tooth 路徑的最後一段(例如 github.com/user/MyTool 變為 MyTool),version 原樣複製。結果是以下兩種文檔之一。

文件包:當 tooth.json 只有一個不帶標籤的變體,且其資源全部為 self 時:

  • "type": "files",rid 取自該變體的 platform。
  • 放置規則轉換為 placements。
  • 依賴轉換為 installDependencies,其版本範圍轉換為 LeviLamina 的語法。
  • preserve_files 和 remove_files 轉換為 preserveFiles 和 removeFiles。
  • 腳本轉換為 preInstall、postInstall(先 install,後 post_install)、preUninstall(先 pre_uninstall,後 uninstall)和 postUninstall。

路由文檔:其他情況下,每個變體對應一個條目:variant 為標籤,rid 為平臺。每個條目指向該變體的具體包應當發佈的位置:

  • 對於 github.com/<owner>/<repo> 路徑,指向 release 資源 https://github.com/<owner>/<repo>/releases/download/v{{version}}/{{name}}-<label>[-{{rid}}].mcmod(空標籤記作 default);
  • 否則,指向倉庫中的目錄 ./<label>/。

如果標籤只有空標籤和 client(常見的服務端/客戶端拆分,lip 按平臺選擇),二者會成為默認變體下 "platform": "server" 與 "platform": "client" 的兩個條目,release 資源名為 {{name}}-{{platform}}[-{{rid}}].mcmod。

lip 會用自身的解析器檢查結果;如果結果還不是有效的 manifest.json(例如兩個同標籤的變體相互重疊,或從已有 manifest.json 保留的鍵與之衝突),會給出警告。

lip 不會創建這些包:請按 lip 針對每個變體輸出的提示,自行用該變體的文件構建具體的 manifest.json。參見創建包。

侷限

lip migrate 只是輔助工具,不保證結果正確。請始終檢查其輸出。

  • info 部分(名稱、描述、標籤、頭像)沒有對應項,會被丟棄。
  • self 以外的資源(zip、tar、tgz、uncompressed)需要從 URL 下載,而 manifest.json 無法做到:這樣的變體會成為路由文檔中的一個條目,其文件需要打包進它的具體包中。
  • 在文件包中,每條放置規則都會依據倉庫目錄中的文件(lip v3 正是從這些文件放置的)進行檢查。manifest.json 無法寫成放置相同文件的放置規則(例如 src 為 glob 模式的 file 放置規則)會被展開為每個文件一條的文件放置規則,並給出警告:之後新增的文件在你修改該列表之前不會被放置。
  • platform 的 glob 模式無法表示為 rid;此時包不限定 RID。
  • LeviLamina 語法無法表示的版本範圍會被省略。轉換後接受的版本與 tooth.json 中的範圍不同的(lip 會探測其邊界附近的版本,例如預發佈版本),會保留並給出警告。
  • 不含 / 的 preserve_files 模式過去會匹配任意目錄中的文件名;它會變為 **/<pattern>,並給出警告。
  • 使用了 * 和 ** 以外語法的 glob 模式會原樣複製,但匹配的文件可能不同。
  • 在文件包中,不匹配倉庫中任何文件的放置規則(例如指向目錄的 file 放置規則)在 tooth.json 中不會放置任何文件,但會導致安裝失敗;它會被省略並給出警告。倉庫目錄中可能包含尚未提交的文件,lip 無法區分它們。
  • 格式 1 和 2 中版本範圍無法在格式 3 中讀取的依賴(例如 2.16.x)在安裝 tooth.json 時本就會被忽略;lip 會報告它們,以便你手動添加。
  • 安裝與卸載鉤子以外的腳本(例如 pre_pack 或自定義腳本)以及格式 2 的 prerequisites 沒有對應項,會被丟棄。
  • 轉換得到的文件包會把文件放到與 tooth.json 完全相同的位置。如果你的包是 mod,可以考慮改為 mod(type 不為 "files"),它會被安裝到 mods/<name>/。
  • 對其他 tooth.json 包的依賴仍然有效,因為 lip 仍可安裝 tooth.json 包(它會在內存中把它們轉換為第 4 版)。

只有名稱恰為 v<SemVer> 的標籤(例如 v1.2.3)才是版本。v1.2 這樣的標籤會被忽略。