缘起 #

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 中,不过上面的检查更新的配置貌似还有点小问题