缘起

Linux 用的多了,不免会觉得有一个靠谱好用的包管理器是一件令人身心愉悦的事。许多人也便顺理成章地想要在 Windows 系统上来一个包管理器。

只是一方面微软已然在大力推介其 Microsoft Store,另一方面命令行形式的包管理器对于大多数人也是极为不友好的。如此这般,一个官方的包管理器自然无望。

好在开源社区里从来不缺人造轮子。于是我们现在有了两个选择:ChocolateyScoop,一个 package manager ,一个 command-line installer

既然本文标题为 scoop,那么显然 choco 已不是我们主要要讨论的了,至于最初我为什么选择了 scoop 而非 Choco,原因早已不记得了。或许是因为 choco 分为开源版与商业版,抑或是我尚未真正想要使用 Windows 上的“包管理器”来管理我的所有软件——虽然我不必与各种流氓软件斗智斗勇,但我还是非常享受各种软件的安装过程中的自定义,Add to PATH, 添加到右键菜单。当然,最主要的原因还是 Windows 并没有一个统一的命令行形式的安装软件接口,因此对于普通的软件,还是要无止境地 next——这又和不用包管理器又有什么区别呢?

让我们把视线转到 Linux 平台,apt 等包管理器自动进行了软件的依赖分析与解压、配置的过程。Windows 系统之上与之理念相似的便是所谓“绿色软件”——解压即可使用。这也正是 scoop 所做的,利用所写的 mainfest,将解压、配置环境变量等自动化处理。另一方面,Windows 之上大多数软件并无所谓依赖的东西,最多便是一个 VC runtime,这也使得 scoop 的工作量更少了。

使用

Scoop 默认是安装在你的用户文件夹下的,这样自然有着许多好处,例如不需要管理员权限。但如果你想要将其改变,可以在安装之前更改掉 scoop path

[environment]::setEnvironmentVariable('SCOOP','C:\soft\Scoop','User')
$env:SCOOP='C:\soft\Scoop'

其中的 C:\soft\Scoop 自然可以换成你想要的路径。 而后便是执行官网之上的那一行命令

iex (new-object net.webclient).downloadstring('https://get.scoop.sh')

——若是报错,便将 execution policy 更改一下

Set-ExecutionPolicy RemoteSigned -scope CurrentUser

而后再添加上 extras, versions 之类的 bucket,便可愉快的使用了。

个人推荐先

scoop install sudo 7zip aria2

来获得更好的体验。

其后的使用无非便是 scoop help 中所列举的东西了

mainfest

经过一段时间的使用后,你可能会想要将自己在用的许多软件迁移到 scoop 中,但问题也随之而来。

Scoop 的用户群体并不算是很大,因此许多软件并不会官方提供 scoop install 这样的安装方式。

放弃自然也是不行的,那么不如自己动手丰衣足食,来自己写一个 mainfest 吧!

Scoop 的 mainfest 是一个 json 文件,好处很明显,这样一来其应用描述非常简洁。但坏处也肯定是有的,比如说,不支持注释。好在还有着官方的文档供我们查阅。

下面是一份我写的 mainfest,附上注释,希望能给人点方便。

{
    "homepage": "https://oldj.github.io/SwitchHosts/",
    // 此处为软件主页
    "version": "3.3.12.5349",
    // 版本号
    "license": "MIT",
    // 软件所使用的协议
    "description": "SwitchHosts! is an App for hosts management & switching.",
    // 对软件的描述信息
    "architecture": {
    // 对于分架构进行分发的软件,可以以 architecture 对其区分,如果并不分架构,可直接 url & hash
        "64bit": {
            "url": "https://github.com/oldj/SwitchHosts/releases/download/v3.3.12/SwitchHosts-win32-x64_v3.3.12.5349.zip",
            // 软件包下载链接
            "hash": "037fbc3b7bba4c9f43e105f00f68733397c1b3099e52eb57308a6659482d3fd0",
            // 文件的 hash 值,可通过 Get-FileHash/sha256sum 来获得
            "extract_dir": "SwitchHosts!-win32-x64"
            // 解压的文件夹,指程序压缩包内的文件夹
        },
        "32bit": {
            "url": "https://github.com/oldj/SwitchHosts/releases/download/v3.3.12/SwitchHosts-win32-ia32_v3.3.12.5349.zip",
            "hash": "41e7a2a0cf8261a3fcccfce4cd8d8efc893f3f472dcccd8c3e76623e19f5cf5d",
            "extract_dir": "SwitchHosts!-win32-ia32"
        }
    },
    "bin": "SwitchHosts!.exe",
    // 可执行文件
    "shortcuts": [
        [
            "SwitchHosts!.exe",
            "SwitchHosts!"
        ]
    ],
    // 此处为将其快捷方式加入开始菜单的配置
    "checkver": {
        "url": "https://github.com/oldj/SwitchHosts/releases",
        "re": "SwitchHosts-win32-x64_v([\\d.]+).zip"
    },
    // 自动检查更新所用,不过我这里好像是有点小问题的
    "autoupdate": {
        "architecture": {
            "64bit": {
                "url": "https://github.com/oldj/SwitchHosts/releases/download/v$majorVersion.$minorVersion.$patchVersion/SwitchHosts-win32-x64_v$version.zip"
            },
            "32bit": {
                "url": "https://github.com/oldj/SwitchHosts/releases/download/v$majorVersion.$minorVersion.$patchVersion/SwitchHosts-win32-ia32_v$version.zip"
            }
        }
    }
}

上面的这份已被收入 extras bucket 中,不过上面的检查更新的配置貌似还有点小问题