# scoop ## References + 📑 [**Documentation - scoop**](https://scoop.sh/) + 📑 [**Scoop Apps**](https://bjansen.github.io/scoop-apps/) (尋找套件是否存在於 scoop) + 🔗 [**Windows 套件管理工具 - Scoop**](https://www.gss.com.tw/blog/windows-%E5%A5%97%E4%BB%B6%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7-scoop) ## Installation 1. 開放有數位簽章的網路腳本執行 > 因為要執行網路下載的 scoop 安裝腳本,所以必須開啟這個選項。\ > scoop 安裝腳本有數位簽章,數位簽章內包含 CA 憑證,CA 憑證只核發給認證的機構,\ > 而要通過認證,需要開發者檢附相關文件,比如身份資料、聯絡方式、公司註冊資料等。\ > 所以不用擔心,即便腳本是從網路來的,你也可以信任它。\ > 預設的 ExecutionPolicy 是 Restricted,完全禁止執行任何腳本,非常嚴格。\ > 因此這裡要放寬限制。 ```ps1 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser ``` 2. 從指定 domain 抓 scoop 安裝腳本,執行 scoop 安裝腳本 ```ps1 Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression ``` ## Commands |🚨 <span class="caution">CAUTION</span>| |:---| |若遇到下載錯誤,可以先檢查 Windows Defender,很高機率是它攔住你。<br />(選擇 Allow 再回來通常就可以下載了)| ### 📦 App | 指令 | 說明 | | ---- | ---- | | `scoop list` | 列出所有已安裝 app | | `scoop status` | 檢查可更新的 app | | `scoop install <app>` | 安裝 app | | `scoop install <app>@<version>` | 安裝指定版本 app | | `scoop install -g <app>` | 為所有使用者安裝 app | | `scoop uninstall <app>` | 解除安裝 app | | `scoop uninstall <app> --purge` | 解除安裝 app、完全移除 app 的 [persist](#persist) 設定 | | `scoop update <app>` | 更新 app | | `scoop update *` | 更新所有 app | | `scoop hold <app>` | 鎖定 app 更新 | | `scoop unhold <app>` | 解鎖 app 更新 | | `scoop reset <app>` | 重新掛載該 app 提供的所有執行檔和 [shim](#shim) | | `scoop reset <app>@<version>` | 重新掛載該 app (指定版本) 提供的所有執行檔和 [shim](#shim) | | `scoop info <app>` | 顯示 app 詳細資訊 | | `scoop prefix <app>` | 顯示 app 安裝路徑 | | `scoop which <command>` | 顯示命令實際對應的執行檔 | | `scoop search <keyword>` | 搜尋可安裝的 app | | `scoop home <app>` | 開啟 app 的官方網頁 | ### 🧰 Bucket | 指令 | 說明 | | ---- | ---- | | `scoop bucket list` | 列出本地 bucket | | `scoop bucket known` | 列出官方 bucket | | `scoop bucket add <name>` | 新增 bucket | | `scoop bucket rm <name>` | 移除 bucket | | `scoop bucket update <name>` | 更新指定 bucket | | `scoop bucket update *` | 更新本地所有 bucket | ### 🧹 Clean | 指令 | 說明 | | ---- | ---- | | `scoop cleanup *` | <mark>清理所有 app 的舊版本</mark> | | `scoop cleanup <app>` | 清理指定 app 的舊版本| | `scoop cache show` | 查看目前快取狀態 | | `scoop cache rm *` | <mark>清除所有安裝快取</mark> | | `scoop cache rm <app>` | 清除指定 app 快取 | ### 🧭 Import | 指令 | 說明 | | ---- | ---- | | `scoop export` | 匯出已安裝 app 記錄檔(JSON) | | `scoop import <file>` | 匯入 app 記錄檔,批次安裝 | ### 🧪 Test | 指令 | 說明 | | ---- | ---- | | `scoop checkup` | 偵測 Scoop 問題 | ## Directory ### apps > 存放 app 的目錄 ### buckets > 存放 [bucket](#bucket) 的目錄 ### cache > 快取 ### modules > PS 腳本型 app + app 以 JUNCTION 引用,集中在此目錄 + 此目錄路徑,會加入環境變數 `PSModulePath` (Scoop 安裝時,會自動設定) + 此後 `Import-Module <app>` 時,就能找到 app 裡面的腳本執行 + 先找「菜單」:`.psd1` (主程式在哪?執行前處理腳本?) + 再執行「主程式」:`.psd1` (核心) ### persist > 持久化資料 + 讓你在 update / uninstall app 時,有些資料 (比如:設定) 永不消失 + 所以你要使用 `scoop uninstall <app> --purge`,才能讓持久化資料消失 ### shims > 執行檔 + 此目錄路徑,會加入環境變數 `PATH` + shim 檔中紀錄執行檔的真正路徑 + 所以 `scoop reset <app>` 的魔力在於 + 你安裝了兩個 JDK:`openjdk21`、`openjdk25` + 你可以透過 `scoop reset openjdk21`、`scoop reset openjdk25` 來靈活切換 Java 版本 + 實際上,就是 `java` 與一票工具執行檔,在 `shim` 目錄被重新掛載一遍 ## Nouns ### bucket + 定義 + <mark>存放 app 的安裝定義檔 (manifest)</mark>,通常是 JSON 檔 + 一個 bucket 會有很多這樣的 manifest + 官方目前維護著許多 buckets,比如:main、extras、java... + 官方的這些 bucket 以 GitHub Repo 維護 + 說明 + manifest ```json { "version": "25.01", "description": "A multi-format file archiver with high compression ratios", "homepage": "https://www.7-zip.org/", "license": "LGPL-2.1-or-later", "notes": [ "Add 7-Zip as a context menu option by running:", "reg import \"$dir\\install-context.reg\"" ], "architecture": { "64bit": { "url": "https://www.7-zip.org/a/7z2501-x64.msi", "hash": "e7eb0b7ed5efa4e087b7b17f191797f7af5b7f442d1290c66f3a21777005ef57", "extract_dir": "Files\\7-Zip" }, "32bit": { "url": "https://www.7-zip.org/a/7z2501.msi", "hash": "dce9e456ace76b969fe0fe4d228bf096662c11d2376d99a9210f6364428a94c4", "extract_dir": "Files\\7-Zip" }, "arm64": { "url": "https://www.7-zip.org/a/7z2501-arm64.exe", "hash": "6365c7c44e217b9c1009e065daf9f9aa37454e64315b4aaa263f7f8f060755dc", "pre_install": [ "$7zr = Join-Path $env:TMP '7zr.exe'", "Invoke-WebRequest https://www.7-zip.org/a/7zr.exe -OutFile $7zr", "Invoke-ExternalCommand $7zr @('x', \"$dir\\$fname\", \"-o$dir\", '-y') | Out-Null", "Remove-Item \"$dir\\Uninstall.exe\", \"$dir\\*-arm64.exe\", $7zr" ] } }, "post_install": [ "$7zip_root = \"$dir\".Replace('\\', '\\\\')", "'install-context.reg', 'uninstall-context.reg' | ForEach-Object {", " $content = Get-Content \"$bucketsdir\\main\\scripts\\7-zip\\$_\"", " $content = $content.Replace('$7zip_root', $7zip_root)", " if ($global) {", " $content = $content.Replace('HKEY_CURRENT_USER', 'HKEY_LOCAL_MACHINE')", " }", " Set-Content \"$dir\\$_\" $content -Encoding Ascii", "}" ], "bin": [ "7z.exe", "7zFM.exe", "7zG.exe" ], "shortcuts": [ [ "7zFM.exe", "7-Zip" ] ], "persist": [ "Codecs", "Formats" ], "checkver": { "url": "https://www.7-zip.org/download.html", "regex": "Download 7-Zip ([\\d.]+) \\(\\d{4}-\\d{2}-\\d{2}\\)" }, "autoupdate": { "architecture": { "64bit": { "url": "https://www.7-zip.org/a/7z$cleanVersion-x64.msi" }, "32bit": { "url": "https://www.7-zip.org/a/7z$cleanVersion.msi" }, "arm64": { "url": "https://www.7-zip.org/a/7z$cleanVersion-arm64.exe" } } } } ```