软件包管理工具,是电脑中自动安装、配置、卸载和升级软件包的工具。基于命令行的包管理工具已经在NIX世界中被广泛使用,不论是macOS的Homebrew,还是Linux各大发行版自己的包管理(APT、Yum、Pacman),它们都不仅有着完善的使用机制,还有丰富的软件包生态,是NIX系统安装、管理软件包的不二之选。 Windows在包管理工具方面则一直乏善可陈。社区的努力让Windows有了Chocolatey以及我曾经极力推荐的Scoop,Windows自己在历史上也曾经推出过具有包管理工具类似功能的OneGet和NuGet。但是前二者一直依赖社区维护者的用爱发电,后二者则更强调开发环境的软件安装,没有提供日常用户所使用的软件,都不尽完美。 WinGetWindows官方的包管理工具 在刚刚结束的MicrosoftBuild2020上,微软终于发布了面向广大Windows普通用户的Windows官方包管理工具WindowsPackageManager,也就是WinGet。有了WinGet,Windows用户终于可以通过官方途径来在命令行环境下管理软件了。下载安装 WinGet支持Windows101709及以上版本,现在使用Windows10的同学们就可以直接下载安装。官方提供了下面的几种安装方法:通过MicrosoftStore下载 目前WinGet还在Preview阶段,因此如果你想用官方的渠道安装WinGet,那么你需要:或是加入Windows10Insider,并下载安装WindowsInsider版本的系统或是通过官方注册通道来将自己加入WinGetPreviewflightring 之后,你的系统上面就应该出现(命令行环境下的)WinGet本体,并可以通过MicrosoftStore同步更新。通过GitHubRelease手动安装 另外,你也可以直接去WinGet的官方GitHub仓库,在Release页面手动下载WinGet的安装程序进行手动安装。 在WinGet的GitHubRelease页面手动下载安装令人熟悉的WinGet操作和命令 安装好WinGet之后,我们就可以在PowerShell或者CMD中用winget命令调用它了。 WinGet:微软官方开发的Windows包管理工具 直接运行命令winget,WinGet会给我们展示自己的一些基础操作,包括安装软件、显示软件信息、显示应用源、搜索软件、验证安装程序等等。我自己在日常使用Windows时,是经常使用Scoop进行软件安装管理的,这里我将WinGet和Scoop直接面对面,进行命令的对比,看看常用的几个功能(安装软件、显示信息、搜索软件)之中WinGet和Scoop之间的区别。安装软件 安装软件大家都一样,同样都是wingetinstall{软件名称}和scoopinstall{软件名称}。比如这里,我分别使用WinGet和Scoop下载安装Postman:使用WinGet安装一遍wingetinstallpostman卸载,再用Scoop安装一遍scoopinstallpostman 使用WinGet和Scoop下载安装Postman 安装过程大概都是类似的,WinGet安装的是exe文件,而Scoop安装了NuGet的。nupkg文件。二者都是Windows上常见的软件安装文件。界面上,WinGet的下载进度条比较酷炫,而Scoop使用的依旧是字符进度条,简单淳朴。 另外,WinGet还有一个比较骚的进度条,在刚刚安装命令之后加上rainbow的参数,即可解锁彩虹进度条!(净搞这些有的没的()) 使用WinGet下载安装程序的彩虹进度条与下载全过程显示软件详细信息 同样的,WinGet和Scoop都有支持显示某一个软件的详细信息。这里,WinGet使用的命令是:wingetshowpostman 而Scoop与之对应的命令为:scoopinfopostman 显示待安装软件的详细信息 二者都显示了当前准备安装软件的版本信息、官方网站、原地址、下载链接等等信息,比较类似。搜索特定软件 WinGet和Scoop也一样支持搜索某一软件。使用的是相同的search{软件名称}的命令。比如,搜索Steam:WinGet搜索SteamwingetsearchsteamScoop搜索Steamscoopsearchsteam WinGet和Scoop搜索特定软件 当然,WinGet和Scoop都是关键词匹配搜索,由于Scoop目前的软件库比较丰富,因此搜索到的东西也比WinGet多一些。另外,我发现WinGet搜索速度要比Scoop快一些,可能是由于Scoop需要联网遍历整个软件bucket,导致搜索速度没有那么快。 除了上面介绍的三个命令以外,WinGet还有方便WinGet软件源开发管理人员使用的validate命令和hash命令等等。WinGet安装和管理软件的原理 尚处于Preview阶段的WinGet目前是利用Manifest清单文件来管理与安装不同的软件,这一设计理念和Scoop是高度相似的。为了让各位彻底理解这一过程,我们先介绍WinGet和Scoop这类Windows软件包管理工具在安装软件过程中具体是怎样工作的。 WinGet是典型的Windows思路包管理工具,由于Windows本身的设计,软件的安装几乎都伴随着软件安装器的使用。因此,WinGet一类包管理工具,包括Scoop在内,实际上都是代替我们:寻找软件官方发布地址下载我们设定版本的软件运行软件安装器来安装下载得到的软件并进行环境上的准备、安装后的善后工作等 而WinGet这类包管理是怎样知道去哪里寻找软件、下载软件和进行安装的呢?答案就是通过读取软件对应的Manifest清单文件。 WinGet安装软件的工作原理 就如图中描述的过程一样,WinGet和Scoop在安装软件过程,都是先去各自维护的软件Manifest库,寻找相应的软件安装Manifest清单文件,这一文件就像说明书一样指导软件包管理工具安装软件的具体过程。WinGet和Scoop等Windows包管理工具就会依据软件相应的Manifest文件:准备、下载、安装、善后。 可以发现,在这一过程中,最为重要的一步就是找到软件Manifest库,并从中请求得到待安装软件相应的Manifest文件。对于WinGet来说,微软官方目前维护了一个在GitHub上面开源的microsoftwingetpkgs仓库,用于让WinGet来寻找软件相应的Manifest文件。 GitHub上面Postman的软件Manifest文件 与之相应的,Scoop是通过bucket的机制实现的这一功能特点。在之前的文章给Scoop加上这些软件仓库,让它变成强大的Windows软件管理器中,我就介绍过Scoop不同的软件仓库、如何添加自定义软件仓库以及如何从第三方软件仓库中下载安装软件等等。在WinGet中,我们同样也有相应的方法。 WinGet提供了一个source的命令,利用wingetsource,我们就可以方便地管理不同的WinGet软件Manifest仓库(WinGet官方称之为软件源),比如:wingetsourceadd软件源:添加新的软件源wingetsourcelist:列出当前已添加的软件源wingetsourceupdate:更新当前全部添加的软件源wingetsourceremove:移除当前使用的软件源 当然,由于WinGet也才问世几天,所以还没有出现除了官方仓库外可用的软件仓库。小结 WinGet在我看来,和WindowsTerminal一样,都是Windows团队让Windows系统更加开发者友好的又一努力。不过,WinGet现在着实仅是一个半成品,其半成品最重要的体现在于:仅支持安装软件,不支持卸载软件。 同时,WinGet也并没有逃脱Windows类包管理工具的通病软件安装器并非真正意义上的软件包管理工具。目前来看,WinGet也仅仅是和社区优秀作品Chocolatey、Scoop等Windows包管理工具原理完全一致的一个工具,并没有因为微软自己的加入而有新的花样。 希望未来随着不断迭代,WinGet能够变得不是为了造轮子而造轮子,成为真正意义上的Windows包管理工具,让开发者朋友们像看WindowsTerminal一样高呼真香。感谢阅读。