功能
更新 ccam
本頁由英文機器翻譯而成,歡迎提供修正。 在 GitHub 上編輯此頁
ccam update 會從 GitHub 下載 ccam 的發行版本,以該發行版本的 checksums.txt 驗證,然後透過一次 rename 取代正在執行的執行檔。如果你是用安裝腳本或壓縮檔安裝 ccam,請使用它。ccam 絕不會自行檢查更新:只有這個指令會連線到 GitHub,所以其他所有指令在離線時都一樣能運作。
用法
ccam update # install the latest release
ccam update --check # only say whether a newer release exists
ccam update --version v0.3.0 # install that release, also an older one
ccam --dry-run update # show what would be downloaded and replaced$ ccam update --check
ccam 0.5.0 is available (you have 0.4.0). Run `ccam update`.
$ ccam --dry-run update
Would update ccam 0.4.0 → 0.5.0:
download https://github.com/jhyunwoo/ccam/releases/download/v0.5.0/ccam_linux_amd64.tar.gz
verify with https://github.com/jhyunwoo/ccam/releases/download/v0.5.0/checksums.txt
replace /home/you/.local/bin/ccam
$ ccam update
→ downloading https://github.com/jhyunwoo/ccam/releases/download/v0.5.0/ccam_linux_amd64.tar.gz
✓ Updated ccam 0.4.0 → 0.5.0 (/home/you/.local/bin/ccam)沒有更新的發行版本時,ccam 會印出 ccam 0.4.0 is up to date.,且不變更任何東西。以 --version 指定你目前正在執行的版本時,會印出 ccam 0.4.0 is already installed.
選項
| 選項 | 作用 | 預設值 |
|---|---|---|
--check |
只回報是否有更新的發行版本 | 關閉 |
--version <tag> |
安裝這個發行版本標籤,例如 v0.3.0,可以比目前的版本新或舊 |
最新版本 |
--dry-run |
支援:查詢最新的標籤(除非 --version 已指定),對執行檔執行相同的檢查,並印出下載、總和檢查碼和取代的路徑,但不下載 |
關閉 |
--check 和 --version 不能一起使用。標籤必須是 vMAJOR.MINOR.PATCH 的形式,可以帶有預發行版本或組建後綴;開頭的 v 可以省略。其他寫法都會失敗,例如 --version takes a release tag such as v0.3.0, not "1.2"。
環境變數 CCAM_RELEASES_URL 可以取代 https://github.com/jhyunwoo/ccam/releases,用於鏡像站或測試。它的結構必須相同:<url>/latest 會重新導向到 <url>/tag/<tag>,檔案則位於 <url>/download/<tag>/<asset>。
運作方式
程式碼位於 internal/update,只有 ccam update 會匯入它。啟動流程絕不會呼叫它。
cli.updateCmd以os.Executable找出正在執行的執行檔,並以filepath.EvalSymlinks解析符號連結。被取代的就是這個實際路徑。- 沒有
--version時,Updater.Latest會請求<releases>/latest但不跟隨重新導向,並從Location標頭(…/tag/v0.5.0)讀取標籤。這裡使用的是發行版本頁面而不是 GitHub API,所以不受 API 每小時 60 次請求的限制。查詢的時間限制為 10 秒。 parseVersion以嚴格的格式檢查標籤。標籤會出現在下載 URL 和印出的 shell 指令中,所以任何含有/、%、空白或 shell 字元的內容都無法通過。compareVersions會把它和正在執行的版本比較;預發行版本排在其正式版本之前。managed()和writable()決定 ccam 是否能取代這個執行檔(見下文)。Updater.Fetch同時下載ccam_<os>_<arch>.tar.gz和checksums.txt,兩者合計的時間限制為 2 分鐘。每個下載的上限為 256 MB。- 在做任何其他事之前,壓縮檔的 SHA-256 必須和
checksums.txt中對應的那一行相符。缺少那一行或總和檢查碼不同時,更新會以nothing was changed停止。 extract()讀取 tar,取出第一個名為ccam的一般檔案。資料夾、連結和其他項目都會被忽略,執行檔的上限同樣是 256 MB。Updater.Install以fsutil.AtomicWrite寫入新的執行檔:在執行檔旁邊建立暫存檔.ccam.tmp*,套用舊檔案的權限位元,寫入磁碟後再 rename 覆蓋舊檔案。
從查詢標籤到 rename 的完整流程:
壓縮檔和 checksums.txt 會並行下載,在總和檢查碼相符之前不會寫入任何東西。rename 是原子操作,所以當機或磁碟已滿時,留下的不是舊執行檔就是新執行檔,絕不會只有一半。~/.local/bin/ccwork 這類快捷指令是指向 ccam 執行檔的符號連結,所以不需任何變更就會執行新版本。
由套件管理的安裝
從 .deb 安裝的 ccam 屬於 apt,如果繞過 apt 取代它,套件資料庫的內容就會出錯。在下載之前,ccam 會檢查執行檔歸誰管理:
- 位於
/usr/bin、/bin、/usr/sbin或/sbin的執行檔視為由套件管理。 - 在其他位置時,如果已安裝
dpkg且dpkg -S <path>成功,同樣視為由套件管理。 - 否則 ccam 會在執行檔旁邊建立並移除一個暫存檔
.ccam-update-*,確認自己能在那裡寫入。
對於由套件管理的執行檔,ccam 會停止並印出 apt 的步驟:
$ ccam update
ccam: /usr/bin/ccam was installed by a package, so `ccam update` leaves it alone.
To update the .deb, download ccam_0.5.0_linux_amd64.deb from https://github.com/jhyunwoo/ccam/releases/tag/v0.5.0 and run:
sudo apt install ./ccam_0.5.0_linux_amd64.deb
Or install a copy in ~/.local/bin with the install script:
curl -fsSL https://raw.githubusercontent.com/jhyunwoo/ccam/main/install.sh | sh在 Linux 以外的系統上,只會印出安裝腳本那一行。資料夾無法寫入時,ccam 會建議重新執行安裝腳本,把 ccam 安裝到 ~/.local/bin。
安全性和特殊情況
- 開發版組建的版本會顯示為
dev,沒有可比較的發行版本,所以ccam update和ccam update --check會拒絕執行。ccam update --version vX.Y.Z可以在它上面安裝發行版本。 - 下載失敗、找不到你平台的檔案,或總和檢查碼不符時,已安裝的執行檔都會維持原樣。
- 不存在的發行版本會以
there is no release <tag>失敗。當 GitHub 以 HTTP 403 或 429 拒絕時,ccam 會說明這可能是頻率限制,並請你稍後再試。 --check只會讀取。它不會檢查執行檔是否由套件管理或是否可寫入。- 以
--version指定較舊的標籤就是回復舊版的方法。