本文列舉了Scoop各種使用技巧和相關知識。包含:
- Scoop 的設計與實現理念;
- 自定義Scoop安裝路徑;
- Scoop潛在錯誤排查;
- 如何在Scoop中進行斷點續傳;
- 更新或禁用軟件更新;
- Scoop中的別名;
- 如何在同一程序的不同版本之間切換,比如切換不同版本的JDK;
- 等等各種實用技巧
Scoop 包管理工具介紹
Windows 下常用的包管理工具有:
- Scoop
- Chocolatey
相比於Chocolatey,Scoop則更專注於開源的命令行工具,使用 Scoop 安裝的應用程序通常稱為"便攜式"應用程序,需要的權限更少,對系統產生的副作用也更少,所以我這里選擇了使用 Scoop。
⚠️️ 注意:對於像 VirtualBox、Docker for Windows ,輸入法等這些需要高權限的軟件還是通過在官網下載安裝包進行安裝。
Scoop 安裝與配置
要求:
- PowerShell >= 5.0 (如果是 Window10 則默認滿足此條件)
- 請確保已允許PowerShell執行本地腳本,可以使用下面的命令開啟:
set-executionpolicy remotesigned -scope currentuser
# 或者 (但是它沒有上面的命令安全)
set-executionpolicy Unrestricted -scope currentuser
安裝路徑:
- 用戶級別安裝的程序 和 Scoop 本身默認安裝於
C:\Users\<user>\scoop
- 全局安裝的程序(所有用戶可用,使用
--global
或-g
選項)位
於C\ProgramData\scoop
路徑中。
可以通過更改對應的環境變量更改這些路徑 。
將 Scoop 安裝到自定義目錄 :
打開 PowerShell 先配置環境變量 SCOOP
,再運行 iex
$env:SCOOP='D:\Scoop'
# 先添加用戶級別的環境變量 SCOOP
[environment]::setEnvironmentVariable('SCOOP',$env:SCOOP,'User')
## 下載安裝
# 然后下載安裝 Scoop (如果使用默認安裝路徑則直接運行下面的命令)
iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
# 或者使用下面的命令安裝:
iwr -useb get.scoop.sh | iex
配置全局安裝路徑 (可選,建議不改)
$env:SCOOP_GLOBAL='D:\GlobalScoopApps'
[environment]::setEnvironmentVariable('SCOOP_GLOBAL',$env:SCOOP_GLOBAL,'Machine')
相當於在系統變量中設置:
SCOOP_GLOBAL=D:\GlobalScoopApps
;默認是在
C:\ProgramData\scoop
。
為什么需要全局安裝?
對於那些需要管理員權限的程序需要進行全局安裝。我當前遇到的是當使用 Scoop 安裝字體時需要使用全局安裝,因為字體需要給所有用戶使用。
初次安裝 Scoop 后,建議安裝的程序:
# 但 scoop 進行全局安裝時需要使用到 sudo 命令
scoop install sudo
# scoop下載程序時支持使用 aria2 來加速下載
scoop install aria2
我們可以發現,下載的過程中自動下載了依賴 7-zip。 在安裝方面,它利用了 7zip 去解
壓安裝包/壓縮包,因此它對綠色軟件有天生的友好屬性 。不僅如此,下載之后的內容會自
動將加入到(Path)環境變量中,十分方便。
{{< alert theme="info" >}}
補充: 初次安裝之后我們可以通過運行 scoop checkup
來檢測當前潛在問題,然后根據提示進行修正。
# 檢測本人當前環境存在的問題
$ scoop checkup
WARN Windows Defender may slow down or disrupt installs with realtime scanning.
Consider running:
sudo Add-MpPreference -ExclusionPath 'D:\Scoop\Applications'
(Requires 'sudo' command. Run 'scoop install sudo' if you don't have it.)
WARN Windows Defender may slow down or disrupt installs with realtime scanning.
Consider running:
sudo Add-MpPreference -ExclusionPath 'C:\ProgramData\scoop'
(Requires 'sudo' command. Run 'scoop install sudo' if you don't have it.)
WARN LongPaths support is not enabled.
You can enable it with running:
Set-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem' -Name 'LongPathsEnabled' -Value 1
ERROR 'dark' is not installed! It's required for unpacking installers created with the WiX Toolset. Please run 'scoop install dark' or 'scoop install wixtoolset'.
WARN Found 4 potential problems.
可以看到存在三個警告(WARN),一個錯誤(ERROR),並給出了解決對應問題的命令:
- 前兩個警告(WARN)提示:殺毒軟件 Windows Defender 有可能會使得下載變慢或阻止安裝
- 第三個警告(WARN)提示:Windows中的 NTFS 中默認不允許大於 260 個字符(byte)的文件全路徑存在的限制還未解除。(可能需要添加
sudo
才能運行給出的命令) - 最后一個錯誤提示(ERROR):需要安裝
dark
才能解壓使用 WiX Toolset 創建的安裝包。
{{< /alert >}}
Scoop 的設計與實現理念 :
- 分離用戶數據:默認將程序的 用戶數據 存儲到
persist
目錄中,這樣當用戶日
后升級該程序后之前的用戶配置依然可用。(但是對於部分程序支持的不是很完善) shim
軟鏈接: scoop 會自動在 scoop 應用安裝路徑下的shims
文件夾下為新安裝
的程序添加對應的.exe
文件,而shims
文件夾提前就已被添加到PATH
環境變
量中,所以程序一旦安裝就可以直接在命令行中運行。- 對於 GUI 程序 ,scoop 還會自動為其在開始菜單中添加快捷方式 ,路徑:
C:\Users\<user>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Scoop Apps
Scoop 常用命令
scoop help #查看幫助
scoop help <某個命令> # 具體查看某個命令的幫助
scoop install <app> # 安裝 APP
scoop uinstall <app> # 卸載 APP
scoop list # 列出已安裝的 APP
scoop search # 搜索 APP
scoop status # 檢查哪些軟件有更新
scoop update # 更新 Scoop 自身
scoop update appName1 appName2 # 更新某些app
scoop update * # 更新所有 app (前提是需要在apps目錄下操作)
scoop bucket known #通過此命令列出已知所有 bucket(軟件源)
scoop bucket add bucketName #添加某個 bucket
scoop cache rm <app> # 移除某個app的緩存
安裝卸載軟件
# 安裝之前,通過 search 搜索 APP, 確定軟件名稱
scoop search xxx
# 安裝 APP
scoop install AppName
# 安裝特定版本的 APP;語法 AppName@[version],示例
scoop install git@2.23.0.windows.1
# 卸載 APP
scoop uninstall #卸載 APP
更新軟件
包含:如何禁用更新
scoop update # 更新 Scoop 自身
scoop update appName1 appName2 # 更新某些app
# 更新所有 app (可能需要在apps目錄下操作)
scoop update *
# 禁止某程序更新
scoop hold <app>
# 允許某程序更新
scoop unhold <app>
清除緩存與舊版本
# 查看所有以下載的緩存信息
scoop cache show
# 清除指定程序的下載緩存
scoop cache rm <app>
# 清除所有緩存
scoop cache rm *
# 刪除某軟件的舊版本
scoop cleanup <app>
# 刪除全局安裝的某軟件的舊版本
scoop cleanup <app> -g
# 刪除過期的下載緩存
scoop cleanup <app> -k
別名
⚠️️ 注意:請在 Powershell 中運行下面的命令
# 可用操作
scoop alias add|list|rm [<args>]
## 添加別名,格式:
scoop alias add <name> <command> <description>
# 示例:(注意:必須在 Powershell中運行)
scoop alias add st 'scoop status' '檢查更新'
# 檢查已添加的別名
scoop alias list -v
Name Command Summary
---- ------- -------
st scoop status 檢查更新
# 測試已添加的別名 st
scoop st
# 另一個示例:
scoop alias add rm 'scoop uninstall $args[0]' '卸載某 app'
在同一程序的不同版本之間切換
使用命令:
scoop reset [app]@[version]
示例:
scoop reset idea-ultimate-eap@201.6668.13
scoop reset idea-ultimate-eap@201.6073.9
# 切換到最新版本
scoop reset idea-ultimate-eap
對應版本的程序需要已經安裝於本地系統中;所以在你清除某個軟件的舊版本時考慮一下自己是否還會再次使用到此舊版本。
另外 idea-ultimate-eap 切換過程可能需要更長時間。
其它命令
# 顯示某個app的信息
scoop info <app>
# 在瀏覽器中打開某app的主頁
scoop home <app>
# 比如
scoop home git
添加軟件源 Bucket
Scoop 可安裝的軟件信息存儲在 Bucket(翻譯為:桶)中,也可以稱其為軟件源。Scoop 默認的 Bucket 為 main
;官方維護的另一個 Bucket 為 extras
,我們需要手動添加。
# bucket的用法
scoop bucket add|list|known|rm [<args>]
添加 extras :
scoop bucket add extras
我們也可以添加第三方 bucket ,示例:
scoop bucket add dorado https://github.com/h404bi/dorado
並且明確指定安裝此 bucket (軟件源)中的的程序:
scoop install dorado/<app_name>
# 下面是dorado中特有的軟件,測試其是否添加成功
scoop search trash
推薦的 Bucket(軟件源):
extras
:Scoop 官方維護的一個倉庫,涵蓋了大部分因為種種原因不能被收錄進主倉庫的常用軟件(在我看來是必須要添加的)。地址:lukesampson/scoop-extrasnirsoft
:是一個 NirSoft 開發的小工具的安裝合集。NirSoft 制作了大量的小工具,包括系統工具、網絡工具、密碼恢復等等,孜孜不倦、持續更新。- Bucket 地址:kodybrown/scoop-nirsoft
- NirSoft 官網地址:NirSoft
- dorado(添加了一些國內的app,比如 qqplayer 👍🏻️)h404bi/dorado
- ash258:Ash258/scoop-Ash258
- java:添加后可以通過它安裝各種 jdk 、 jre
- nerd-fonts :包含各種字體
# 先添加bucket
scoop bucket add extras
scoop bucket add nirsoft
scoop bucket add dorado https://github.com/h404bi/dorado
scoop bucket add Ash258 'https://github.com/Ash258/Scoop-Ash258.git'
scoop bucket add nerd-fonts
# 對於開發人員,可添加下面的兩個
scoop bucket add java
scoop bucket add versions
bucket 更新時遇到問題
情況是這樣:當我運行 scoop update
進行更新時提示: extras
bucket 更新失敗。於是我將其刪除后再添加,提示成功,但是它卻把 main
bucket (默認的 bucket) 給刪除了。通過"scoop status"檢查狀態時出現 "These app
manifests have been removed"並且下面列出了已被移除的軟件名單。 那么如何解決此問題?
我們需要重新添加 main bucket :
scoop bucket add main #添加 main bucket
網絡問題導致app安裝失敗
一個示例:
scoop install mediainfo
當安裝 mediainfo 時由於網絡問題,安裝包無法下載,從命令行輸出信息中可以看到如下
內容
ERROR Download failed! (Error 1) An unknown error occurred
ERROR https://mediaarea.net/download/binary/mediainfo/19.09/MediaInfo_CLI_19.09_Windows_x64.zip
referer=https://mediaarea.net/download/binary/mediainfo/19.09/
dir=D:\Scoop\Applications\cache
out=mediainfo#19.09#https_mediaarea.net_download_binary_mediainfo_19.09_MediaInfo_CLI_19.09_Windows_x64.zip
ERROR & 'D:\Scoop\Applications\apps\aria2\current\aria2c.exe' --input-file='D:\Scoop\Applications\cache\mediainfo.txt'
我們可以發現文件的下載路徑和下載后的文件名稱,這里 out=
后面的壓縮包就是下載后
文件的名稱,(也可以在 scoop 的 cache
目錄下的 mediainfo.txt
文件中找到下載路徑與文
件名稱)
然后我們可以嘗試在瀏覽器或其他下載程序中(可以 fq 的程序中)下載該程序,下載完成
后再更改文件名並將其放入 scoop 的 cache
目錄,最后再次運行
scoop install mediainfo
即可安裝。
如何利用 aria2 進行斷點續傳?
先看具體示例:
# 更新 vscode
scoop update vscode-portable
scoop 更新 vscode 時下載到 80%的時候 失敗了(安裝時處理方法也一樣)。我們需要在提示中找到如下內容:
'D:\Scoop\Applications\apps\aria2\current\aria2c.exe' --input-file='D:\Scoop\Applications\cache\vscode-portable.txt'
--user-agent='Scoop/1.0 (+http://scoop.sh/) PowerShell/5.1 (Windows NT 10.0; Win64; x64; Desktop)'
--allow-overwrite=true --auto-file-renaming=false
--retry-wait=2 --split=5 --max-connection-per-server=5
--min-split-size=5M --console-log-level=warn --enable-color=false
--no-conf=true --follow-metalink=true --metalink-preferred-protocol=https
--min-tls-version=TLSv1.2 --stop-with-process=15584 --continue
我們從上面的信息中提取出下面的命令;若要進行斷點續傳,只需再次執行下面的命令即可:
aria2c.exe --input-file='D:\Scoop\Applications\cache\vscode-portable.txt
當提示下載完成后,我們需要再次運行 scoop 對應的 app 更新命令(或安裝命令),即可完成 app 更新(或安裝):
scoop update vscode-portable
安裝和切換JDK、Python的版本
這里需要使用 scoop reset
它的作用是:重置一個應用程序來解決沖突。
命令格式為:
scoop reset <java>[@<version>]
安裝和切換不同的 JDK 版本:
PS C:> scoop bucket add java
PS C:> scoop install oraclejdk
Installing 'oraclejdk' (12.0.2-10) [64bit]
PS C:> scoop install zulu6
Installing 'zulu6' (6.18.1.5) [64bit]
PS C:> scoop install openjdk10
Installing 'openjdk10' (10.0.1) [64bit]
PS C:> java -version
openjdk version "10.0.1" 2018-04-17
OpenJDK Runtime Environment (build 10.0.1+10)
OpenJDK 64-Bit Server VM (build 10.0.1+10, mixed mode)
PS C:> scoop reset zulu6
Resetting zulu6 (6.18.1.5).
Linking ~\scoop\apps\zulu6\current => ~\scoop\apps\zulu6\6.18.1.5
PS C:> java -version
openjdk version "1.6.0-99"
OpenJDK Runtime Environment (Zulu 6.18.1.5-win64) (build 1.6.0-99-b99)
OpenJDK 64-Bit Server VM (Zulu 6.18.1.5-win64) (build 23.77-b99, mixed mode)
PS C:> scoop reset oraclejdk
PS C:> java -version
java version "12.0.2" 2019-07-16
Java(TM) SE Runtime Environment (build 12.0.2+10)
Java HotSpot(TM) 64-Bit Server VM (build 12.0.2+10, mixed mode, sharing)
安裝和切換不同的 Python 版本:
$ scoop bucket add versions # add the 'versions' bucket if you haven't already
$ scoop install python27 python
python --version # -> Python 3.6.2
# switch to python 2.7.x
$ scoop reset python27
python --version # -> Python 2.7.13
# switch back (to 3.x)
$ scoop reset python
python --version # -> Python 3.6.2