Scoop 进阶教程

1 概述

在前面的 win10 快速搭建各种开发环境中,我们已经学会了如何安装 Scoop 以及 Scoop 的基本使用,接下来让我们学习下 Scoop 的一些高级用法。

2 帮助命令

Scoop 命令的信息是内置的,所以我们可以通过下面命令查看内置命令一些信息及用法:

scoop help

运行将会输出下面内容:

alias          管理别名
bucket         管理软件源
cache          显示或清除下载缓存
checkup        检查潜在问题
cleanup        通过删除旧版本来清理应用程序
config         获取或设置配置值
create         创建一个自定义应用程序清单
depends        列出应用程序的依赖项
export         导出(一个可导入的)已安装的应用程序列表
help           显示命令的帮助
hold           禁用应用程序更新
home           打开应用程序主页
info           显示应用程序的信息
install        安装应用程序
list           已安装的应用程序列表
prefix         返回指定应用程序的路径
reset          切换应用程序版本
search         搜索可用的应用程序
status         显示状态和检查新的应用程序版本
unhold         启用应用程序更新
uninstall      卸载应用程序
update         更新应用程序或Scoop本身
virustotal     在virustotal.com上寻找应用程序的哈希
which          定位shim/可执行文件(类似于 Linux 上的 'which')

要查看特定命令的帮助,请运行下面命令:

scoop help <command>

比如想要查看 cache 命令怎样使用,可以运行下面命令:

scoop help cache

3 卸载 Scoop

如果你想卸载 Scoop 和所有与 Scoop 一起安装的程序,你可以运行下面命令:

scoop uninstall scoop

4 App Manifest

4.1 简介

App Manifest 表示应用程序清单,它是一个 JSON 文件,定义了下载、校验、安装软件等信息,一个 App Manifest 就代表了一个软件,许多 App Mainifest 就组成了 Bucket,可以表示为一个软件仓库。

如果已知 App Manifest 文件位置,你还可以运行下面命令来安装软件:

scoop install shared/files/scoop/app.json
# 或者
scoop install https://gist.github.com/xxxx/xxxx/raw/app.json

4.2 属性

4.2.1 必须属性

version:表示应用程序版本信息。

4.2.2 可选属性

##: 包含注释的单行字符串或字符串数组。

architecture:如果应用程序有 32 位和 64 位版本,可以使用这个来表示,它有两个子属性,一个是 32bit ,一个是64bit,这两个属性都可以使用 bincheckverextract_dirhashinstallerpre_installpost_installshortcutsuninstallerurl等属性,示例如下:

"architecture": {
    "64bit": {
        "url": "https://7-zip.org/a/7z1900-x64.msi",
        "hash": "a7803233eedb6a4b59b3024ccf9292a6fffb94507dc998aa67c5b745d197a5dc"
    },
    "32bit": {
        "url": "https://7-zip.org/a/7z1900.msi",
        "hash": "b49d55a52bc0eab14947c8982c413d9be141c337da1368a24aa0484cbb5e89cd"
    }
},

autoupdate:定义如何自动更新 App Manifest 文件,示例如下:

"checkver": {
    "re": "/(?<type>early_access|GA)/(?<path>jdk(?<major>[\\d.]+)(?:.*)?/(?<build>[\\d]+)(?:/GPL|/binaries)?)/(?<file>openjdk-(?<version>[\\d.]+)(?<ea>-ea)?(?:\\+[\\d]+)?_windows-x64_bin.(zip|tar.gz))",
    "replace": "${version}-${build}${ea}"
},
"autoupdate": {
    "architecture": {
        "64bit": {
            "url": "https://download.java.net/java/$matchType/$matchPath/$matchFile"
        }
    },
    "hash": {
        "url": "$url.sha256"
    },
    "extract_dir": "jdk-$matchVersion"
}

bin:应用程序可执行文件。您还可以创建别名 shim,它使用与实际可执行文件不同的名称,并(可选)将参数传递给可执行文件,格式为: [ "program.exe", "alias", "--arguments" ],示例如下:

"bin": [
        "busybox.exe",
        [
            "busybox.exe",
            "ar",
            "ar"
        ],
        [
            "busybox.exe",
            "arch",
            "arch"
        ]
]

checkver:应用维护者和开发者可以使用 scoop/bin/checkver 目录下的 checkver.ps1 工具来检查应用版本。checkver 清单中的属性是一个正则表达式,可用于匹配应用主页中应用的当前稳定版本,示例如下:

"checkver": {
      "url": "https://golang.org/dl/",
      "regex": "go([\\d.]+)\\.windows-"
  },

depends:将自动安装应用程序的运行时依赖项。

description:对应用程序的描述,不要包含程序的名称,如果它与应用程序的文件名相同。

env_add_path: 将此目录添加到用户路径或系统路径,该目录是相对于安装目录的,并且必须在安装目录中。

env_set: 为用户或系统,设置一个或多个环境变量,示例如下:

"env_set": {
      "GOROOT": "$dir"
  },

extract_dir: 如果 url 指向一个压缩文件(支持 .zip.7z.tar.gz.lzma.lzh),Scoop 将只提取其中指定的目录。

extract_to: 如果 url 指向一个压缩文件(.zip.7z.tar.gz.lzma.lzh 支持),Scoop 会将所有内容提取到指定的目录。示例如下:

"extract_to": [
    "",
    "Plugins"
],

hash: 一个字符串或字符串数组,其中每个 URL 都有一个文件哈希 url。默认情况下,散列是 SHA256,但您可以通过在散列字符串前加上 sha512:sha1:md5:前缀来使用 SHA512、SHA1 或 MD5。

homepage:程序的主页。

innosetup:true 如果安装程序基于 InnoSetup,则设置该值。

installer:运行非 MSI 安装程序的说明。

  • file: 安装程序可执行文件。
  • script:要作为安装程序/卸载程序执行的命令。
  • args:传递给安装程序的参数数组,可选的。
  • keep:true :如果安装程序在运行后应该保留(以供将来卸载为例),则设置该值,如果省略或设置为任何其他值,安装程序将在运行后被删除。可以参考extras/oraclejdk 示例。在uninstaller 指令中使用时,将忽略此选项。
  • $fname$manifest$architecture$dir 等变量可用于 scriptargs属性。
  • scoop installscoop upgrade 运行期间调用。

license:程序软件许可证,对于众所周知的许可证,请使用 https://spdx.org/licenses/ 上的标识符,对于其他许可证,请使用许可证的 URL(如果可用)。

notes:单行字符串或字符串数组,在安装应用程序后显示一条消息。

persist: 应用程序数据持久化。

post_install:安装应用程序后要执行的命令,可以使用变量,如 $dir$persist_dir$version

pre_install: 与post_install 相同的选项,但在安装应用程序之前执行。

psmodule:作为 PowerShell 模块安装在 ~/scoop/modulesname(必需):模块的名称,该名称应至少与解压目录中的一个文件匹配,以便 PowerShell 将其识别为模块。

shortcuts:在开始菜单中添加快捷方式。该数组必须包含一个可执行文件/标签对。第三个和第四个元素是可选的。

  1. 目标文件的路径,必填。
  2. 快捷方式的名称(支持子目录:<AppsSubDir>\\<AppShortcut> 例如 sysinternals),必需。
  3. 启动参数, 可选。
  4. 图标文件的路径, 可选。

suggest:显示一条建议消息。

uninstaller:与installer相同的选项,运行文件/脚本以卸载应用程序。

url:要下载的文件的 URL。如果有多个 URL,您可以使用 JSON 数组。

4.3 示例

我们可以看下 7zip 这个软件的 App Manifest 是怎样的,7zip 放在 main 这个 git 仓库的 bucket 文件夹下,它的文件名是 7zip.json,文件内容如下:

{
    "version": "19.00",
    "description": "A multi-format file archiver with high compression ratios",
    "homepage": "https://www.7-zip.org/",
    "license": {
        "identifier": "Freeware,LGPL-2.0-only,BSD-3-Clause",
        "url": "https://www.7-zip.org/license.txt"
    },
    "architecture": {
        "64bit": {
            "url": "https://7-zip.org/a/7z1900-x64.msi",
            "hash": "a7803233eedb6a4b59b3024ccf9292a6fffb94507dc998aa67c5b745d197a5dc"
        },
        "32bit": {
            "url": "https://7-zip.org/a/7z1900.msi",
            "hash": "b49d55a52bc0eab14947c8982c413d9be141c337da1368a24aa0484cbb5e89cd"
        }
    },
    "extract_dir": "Files\\7-Zip",
    "bin": "7z.exe",
    "shortcuts": [
        [
            "7zFM.exe",
            "7-Zip"
        ]
    ],
    "checkver": {
        "url": "https://www.7-zip.org/download.html",
        "regex": "Download 7-Zip ([\\d.]+)"
    },
    "autoupdate": {
        "architecture": {
            "64bit": {
                "url": "https://7-zip.org/a/7z$cleanVersion-x64.msi"
            },
            "32bit": {
                "url": "https://7-zip.org/a/7z$cleanVersion.msi"
            }
        }
    }
}

该文件描述从哪里下载 7zip 这个软件,怎样校验下载的软件,怎样进行安装等,一般配置 versionhomepagearchitectureurlhashbin 这几个属性就可以了,其它的是可选的。

App Manifest 开始编写的时候,需要到官网,把软件下载下来,然后本机查看 hash,默认为 sha256 码,也有 md5sha1 形式的,命令如下:

certutil -hashfile [file] sha256
certutil -hashfile [file] md5
certutil -hashfile [file] sha1

获取到软件的 hash 后直接填入到 App Manifest。

url 是比较难处理的。简单说,开源软件最方便,很多可以开箱即用,而非开源的不少就特别繁琐,有的甚至处理不了。现在简单介绍下一般情况:

  • .msi类:一般不需要改变。
  • .zip类:一般不需要改变,部分需要在下载链接末尾添加 #/dl.7z
  • .exe类:大部分都需要在下载链接末尾添加 #/dl.7z,Scoop 默认使用 7zip 进行解压安装,不能直接解压的,如果内置有 innosetup,需要在脚本里添加,"innosetup": true。

5 Bucket

5.1 简介

Bucket 中文意思是,在 Scoop 中,Buckets 是应用程序的集合,也可以理解成一个软件配置清单仓库。更具体地说,Buckets 是一个 Git 存储库,其中包含描述如何安装应用程序的 JSON 配置清单。

默认情况下,当您运行 scoop install <app>,它会在 main 中查找,但也可以从其他 Bucket 安装。

Scoop 支持添加其他 Bucket,任何人都可以设置自己的 Bucket,其他人可以从这个 Bucket 添加和安装——他们只需要知道存储 Bucket 的 Git 存储库的位置。

5.2 查看已知 Bucket

查看已知 Bucket,即 Scoop 已经知道这个桶在哪里,你可以运行下面命令:

scoop bucket known

5.3 添加其它 Bucket

如果 Bucket 是 Scoop 已知的,你可以运行下面命令:

scoop bucket add <bucket name>
 
# 实例添加 extras bucket
scoop bucket add extras

如果 Bucket 对于 Scoop 是未知的,你必须指定它的位置,即 Git 存储库,你可以运行下面命令:

scoop bucket add <bucket name> <git location>
 
# 实例添加 extras bucket
scoop bucket add extras https://github.com/lukesampson/scoop-extras.git

5.4 创建 Bucket

Scoop bucket 的创建的关键步骤如下:

  1. 使用 Bucket 模板创建一个 git 项目。
  2. 创建 App Manifest 文件。
  3. 提交文件。
  4. 将项目上传到 Gitee 或 GitHub。

Bucket 已经有了一套比较好的模板,这是当前 Scoop 社区的 Leader 写的 模板,我们可以直接下载下来使用,其他文件基本不用改动,将自定义的 App Manifest 放在 bucket 文件夹里面就行,App Manifest 配置完成后,提交代码,然后将将项目 push 到 Gitee 或 GitHub,然后本地添加这个 Bucket,添加命令如下:

scoop bucket add <项目名> <项目 git 地址>

6 实战:创建自己的 Bucket 并添加 chiner 软件

6.1 简介

chiner 原名叫 PDMan,它是由国人开发的一款非常好用的数据库建模软件,代码开源,目前托管在码云上,目前 Scoop 的 Bucket 没有添加这个软件,所以让我们来学习下怎样添加这个软件到自己的 Bucket仓库。

6.2 配置 Bucket

  1. 登录码云,创建一个仓库。
  1. 选择点击导入。
  1. 仓库 URL 配置为 Scoop 的模板 URL,然后配置仓库名称,配置完成后选择导入。
  1. 仓库创建好了,然后复制 URL,在命令运行 git clone <url>
  1. 项目下载完成后,我们需要下载 chiner 这个软件,然后运行下面命令获取 hash
certutil -hashfile CHINER-win_v3.3.0.exe sha256
  1. 进入项目目录,在 bucket目录里创建 chiner.json文件,文件内容如下:
{
   "version": "3.3.0",
   "description": "元数建模,一款丰富数据库生态,独立于具体数据库之外的,数据库关系模型设计平台。",
   "homepage": "http://www.pdman.cn/#/",
   "license": "MIT",
   "architecture": {
       "32bit": {
           "url": "http://chiner-release.httpchk.com/CHINER-win_v3.3.0.exe#/dl.7z",
           "hash": "d7ec91e6b820dcf269351829267f5c33c791d81b132bdcc4f15c798724376518",
           "pre_install": [
               "Expand-7zipArchive \"$dir\\`$PLUGINSDIR\\app-32.7z\" \"$dir\"",
               "Remove-Item \"$dir\\`$*\", \"$dir\\Uninstall*\" -Recurse"
           ]
       }
   },
   "bin": "CHINER元数建模.exe",
   "shortcuts": [
       [
           "CHINER元数建模.exe",
           "CHINER元数建模"
       ]
   ]
}

bin 属性获取,你可以解压 chiner 这个软件,然后再解压 app-32.7z,解压后里面的可执行文件就是 bin 的值。

  1. 保存文件,然后通过下面命令提交文件并推送到 Gitee:
git add *
git commit -m "add chiner app"
git push

6.3 添加 Bucket 并安装软件

安装成功后,在菜单打开该软件。

7 总结

Scoop 还有一些高级用法,我这里并没有列出来,那些用法一般不会用到,如果大家有兴趣,可以去看下官方文档。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容