lip self-update
把 lip 自身更新到最新發佈的版本。
概要
lip self-update [--check] [-h | --help]說明
lip self-update 找出 lip 的最新發佈;如果它比正在執行的 lip 新,就按 lip 當初的安裝方式安裝它。
檢查
lip 從 GitHub API 讀取 lip 的發佈,地址是 https://api.github.com/repos/LiteLDev/lip/releases?per_page=100。草稿,以及標籤不是 v 加 SemVer 版本的發佈,會被忽略。
最新發佈是版本最高的那個。像 1.1.0-beta.1 這樣的預發行版本,只有在正在執行的 lip 本身也是預發行版本時才計入。
沒有任何發佈,或者最新發佈並不比正在執行的 lip 新時,lip 寫明它已是最新,並且不做任何變更。帶 --check 時,無論哪種情況,lip 都到此為止。
安裝類型
| 類型 | 含義 | lip 如何得知 |
|---|---|---|
msi | lip 是由 Windows 安裝程式 lip-<version>-<platform>.msi 安裝的。 | lip 可執行檔旁邊的 install.json 檔案內容為 {"kind": "msi"}。它由安裝程式寫入。 |
portable | lip 是從歸檔中解壓縮出來的,或以其他任何方式安裝的。 | 沒有 install.json。 |
如果 install.json 存在,卻不是 kind 為 "msi" 的 JSON 物件,lip self-update 失敗。
<platform> 是 lip 執行所在的系統:win-、linux- 或 osx-,後接 x64 或 arm64。在其他系統上,lip self-update 在做出任何變更之前失敗。
更新
不帶 --check 且存在更新的發佈 V 時,lip 依次:
-
讀取安裝類型。
-
選定發佈中要安裝的檔案。發佈中沒有這個檔案,或者沒有
SHA256SUMS檔案時,命令失敗。在 Windows 以外的系統上,類型msi也會失敗。類型 檔案 msilip-V-<platform>.msiLinux 上的 portablelip-V-<platform>.tar.xzWindows 和 macOS 上的 portablelip-V-<platform>.zip -
清空並建立快取目錄中的
self-update目錄。 -
下載
SHA256SUMS,即該發佈的校驗和。 -
把檔案下載到
self-update中。如果SHA256SUMS中沒有這個檔案的行,或者下載內容的 SHA-256 不一致,lip 刪除下載的檔案並失敗。 -
按安裝類型安裝該檔案;見下文。
第 1 到 5 步中的失敗不會變更安裝目錄中的任何檔案。
msi。 lip 以系統管理員身份啟動 msiexec /i <file> /qn /norestart;Windows 會請你允許。你拒絕,或者 msiexec 沒能啟動時,命令失敗。否則 lip 寫明安裝程式正在執行,並立即以結束代碼 0 結束,不等待它結束。安裝程式在背景靜默地取代 lip,不會重新啟動 Windows。請關閉其他正在執行的 lip 處理程序,讓它能夠完成。
portable。 lip 把歸檔解壓縮到 self-update 中,然後逐個取代 lip 所在目錄中的檔案:每個已有的檔案先改名為 <file>.old,再在原位置寫入新檔案。任何一步失敗時,lip 把所有改過名的檔案恢復原樣,然後失敗。所有檔案都寫好之後,lip 刪除能刪除的 .old 檔案和 self-update 目錄。
- 目錄中不在歸檔裡的檔案會保留。
- 在 Windows 上,正在執行的
lip.exe無法刪除,所以lip.exe.old會留下。下一次啟動的lip會刪除它。 - 在 Linux 上,解壓縮
.tar.xz歸檔需要系統中有tar和xz。
更新之後
如果這次更新取代了 lip 或啟動了安裝程式,執行它的常駐程式會在空閒後結束,這樣下一條命令就會啟動新版本。它還在執行託管伺服器時會繼續執行;參見更新之後。
網路
發佈清單和 SHA256SUMS 始終直接從 GitHub 讀取,這樣代理伺服器無法改變 lip 安裝的內容。只有更新檔案本身通過 github_proxy 下載。
選項
| 選項 | 說明 |
|---|---|
--check | 只查找最新發佈。不安裝任何東西,也不做任何變更。 |
-h、--help | 輸出幫助並結束。 |
輸出
只有 lip self-update --check 有結果。存在更新的發佈時,標準輸出收到它的版本和一個換行:
1.1.0lip 已是最新時,標準輸出什麼都收不到。其餘的都是寫到標準錯誤的消息。
所以指令碼要靠輸出是否為空來區分這兩種情況,而不是靠結束代碼。
結束狀態
| 結束代碼 | 含義 |
|---|---|
0 | lip 已是最新;或 --check 已完成(無論是否存在更新的發佈);或更新已安裝;或安裝程式已啟動。 |
非 0 | 用法錯誤,或檢查或更新失敗。 |
示例
檢查是否有新版本:
lip self-update --check更新 lip:
lip self-update在 POSIX shell 指令碼中,只在有新版本時更新:
if [ -n "$(lip self-update --check 2> /dev/null)" ]; then
lip self-update
fi