


如果用过 macOS 或者 Linux 的朋友,或多或少都听说过包管理工具。通过包管理工具,你可以直接在终端中快速自动地安装、配置、卸载和升级软件,而无需通过 GUI 页面一步步手动安装下载软件。这非常适合一次性安装非常多软件,大大地节约了软件安装所需要的时间和步骤,同时也在一定程度上确保了来源软件的安全性。
然而在 Windows 上一直以来都鲜少出现类似的工具,社区中不乏有 Chocolatey 以及 Scoop 这样的第三方工具,但这两款工具都过分依赖社区支持,软件包数量上也都非常有限。直到去年 Build 2020 期间,微软自己亲自下场宣布推出 Windows 包管理工具 winget,而在今年的 Build 2021 上这款工具终于迈入 1.0 版本。
随着首个正式版本的发布,我们也终于可以对其功能进行全面地测试,至少在我看来,现在的 winget 才真的能称得上「Windows 的包管理工具」。
和之前测试版一样,winget 支持 Windows 1809 及以上版本的 Windows 10,你可以通过下列两种方式安装:
相比以前测试版繁琐的注册操作,正式版的 winget 我们可以直接通过 Microsoft Store 进行安装,搜索找到「应用安装程序」点击安装即可。这不只是最为简单的办法,也是最方便的方法,winget 可以随着 Microsoft Store 自动更新到最新版本。

如果你不方便通过 Microsoft Store 进行下载,也可以在 winget-cli 的官方 Github 仓库中直接 在 Release 页面手 动下载 winget 的安装程序进行手动安装。这里需要选择下载后缀为 的软件并双击安装。

不过这种安装方式可能会因为 Windows 10 的安全限制导致无法安装。如果你也遇到了这个问题,则需要在系统设置中找到「更新和安全」-「开发者选项」,打开其中的「开发人员模式」来允许在任意源安装应用。

接下来我们一起看看 winget 1.0 如何使用吧!
之后我们打开 Powershell 或者 CMD(也可以直接使用 Windows Terminal),在终端窗口中直接输入 后如果可以看到对应版本信息就表示 winget 已经安装到系统中了。要说到 1.0 最大的变化,可能就是原先的「实验性功能」几乎全部转正,也就是说你可以完全通过 winget 安装、更新、卸载软件了(此前测试版本不能卸载指定的软件)。下面我们就详细介绍下 1.0 的所有功能吧!
这个用法和其他平台的包管理工具基本相同,语法上就是:
比如我想安装微软的 openjdk,那么输入的命令就是
这时候 winget 会解析并下载软件包、验证安装包哈希,最后调用软件包的安装器。因为下载的软件包基本上都是 .exe 后缀,加上大多需要通过 UAC 提权,因此安装软件过程中大概率会弹出调用 GUI 安装交互界面,其实并不能实现真正意义上的完全静默安装。

想要卸载或者更新软件,那么首先就要知道在当前系统下安装了到底多少的软件,这里使用的是 list。
这里 winget 会将你安装的 win32 软件以及通过 Microsoft Store 安装的软件记录下来,并且将软件的 ID 和软件源里面的软件列表进行对应。最终会将安装的 win32 软件以及 UWP 软件的软件名和软件 ID以列表的形式列出,方便你指定一款软件进行进一步的操作。

这条命令可以检查当前已经安装的某一款软件的软件信息或者是列在源里面但尚未下载安装的软件信息,主要的参数是 show:

和很多系统下的包管理系统类似,winget 同样可以对软件源进行管理,你可以通过 source 来对当前 winget 的软件源进行操作:
这个命令下面还有子命令,比如你可以添加、删除、查看以及更新软件源列表,目前尚未针对国内环境推出相对应的软件源镜像,所以目前在使用 winget 安装下载软件时会遇到比较严重的网络问题。
和其他包管理器一样,我们可以使用近乎相同的方法在源里搜索软件包,甚至命令也完全一样:
无需添加其他的通配符就会直接列出和该关键词匹配的软件,并且给出源地址、软件 ID 版本信息等等。而在 winget 中可以快速定位需要安装的软件 ID 并进行下一步的安装操作,不过 search 命令目前看来还不够完善,比如目前并不能在搜索结果中给出软件是否已经完成安装。
最初的 winget 只能安装但不能卸载,卸载软件还是需要通过控制面板的「程序和功能」来实现,而后卸载功能被放在实验性功能里面,而随着 1.0 正式发布而终于转正。
用法上和其他平台包管理工具语法基本类似:
虽然整个命令中需要指定已经安装的软件名称或者软件 ID,但实际上该命令在运行的同时已经先运行了 来罗列安装列表。测试下来感觉这条参数命令依旧不够成熟,主要集中在两个方面:一方面是卸载基于 Electron 打包的软件时会出现命令调用失败;另一方面是软件名中有空格会找不到指定软件。

不过相比去年的测试版本,现在 winget 已经可以卸载处理 win32 以及从 Microsoft store 下载安装的软件,甚至还可以用来卸载通过 Microsoft edge 安装的 PWA 应用。

和其他的包管理器类似,winget 也可以支持对当前的安装的软件进行更新升级,虽然从命令的说明来看需要指定某一款软件在进行升级,不过最好的方式就是不加参数,先让 winget 将当前安装的列表和软件源进行比对:

其实这里一样先运行了,然后列出了所有可以更新的软件列表,之后的命令形式类似安装软件的命令:
当然这里遇到的问题主要是无法更新或者是更新后再刷新时依旧显示旧版本。根本问题还是 win32 软件的打包方式并无统一标准,加上很多软件安装目录也不统一(有的安装到用户目录,有的安装到 Program Files),导致 winget 的对安装目录判断有误,最后引起了。
随着 winget 进入到 1.0 正式版,原先那些被暂时放在实验功能的命令参数纷纷「毕业」成为正式功能,因此现阶段你会发现只有一个功能还处于实验功能中:

也就是 Microsoft Store 支持,而这里就需要通过设置功能来开启,只不过目前设置功能也没有 GUI 界面,基本上就是直接打开 winget 的设置 json 文件。
这里根据需要手动进行添加相关的代码块来开启部分功能,微软也在项目的 GitHub 页面中列出了可以修改或者增添的代码配置段说明,只需要根据说明将想要的代码块添加到 json 中,然后重启终端即可生效。

总的来说,在经过近一年多的开发之后,winget 发布的首个正式版本可以说是「基本合格」,首先在命令上 winget 借鉴了多个平台的主流包管理系统,对于习惯在 Linux 或者 macOS 上通过包管理工具来管理软件的用户来说非常容易上手,并且可以很快组合出自己的管理命令组合。
当然,由于 Windows 平台各种历史遗留问题,winget 也存在着天生的限制,这主要集中在由于不同软件安装和卸载功能的实现方式不同,从而造成的各种软件安装/卸载中的调用问题。
不过透过现象看本质,我们依旧可以看出微软更希望将其打造成 Windows 10 上的 Homebrew——通过 winget 来弥补Microsoft Store 软件数量上的不足,从而打造出更适合现状的 Windows 应用商店,而现在我们已经看到了蓝图的第一部分。