遷移包
lip 包過去由 tooth.json(格式版本 1 到 3)描述,現在由 manifest.json(格式版本 4,參見包清單)描述。lip 仍可安裝 tooth.json 包,但你的包的新版本應使用 manifest.json。lip migrate 命令可幫助你完成轉換。
使用 lip migrate
在包倉庫的根目錄(即包含 tooth.json(格式 1、2 或 3)的目錄)中不帶參數運行 lip migrate:
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 這樣的標籤會被忽略。