查看原文
其他

Windows 也有包管理工具?

老逛 逛逛GitHub 2021-08-19
对于开发者来说,一款好用的软件包管理工具可以大大提高安装、部署、管理软件的效率。在 Win 环境下,我们手动安装一款软件的流程是:
  • 寻找软件官方发布地址,或通过某软件管家

  • 下载我们设定版本的软件

  • 运行软件安装器来安装下载得到的软件

  • 并进行环境上的准备、安装后的善后工作等(配置 Path, 删除安装包等)

之前只有 MacOS 和 Linux 官方才有软件包管理工具,其实微软官方也为 Windows 系统发布了一款名为 Winget 的软件包管理工具。
虽然在 Windows 平台已经有 scoop 和 chocolately 这样的包管理工具,但毕竟 WinGet 是微软亲儿子,而且在不断更新中。
现在 Winget 还处于开发预览阶段,项目托管在 GitHub 上。同时,微软还在 GitHub 上维护着 winget-pkgs 仓库。
winget-pkgs 和 WinGet 的关系是:WinGet 需要使用软件源 Manifest 来管理和安装软件,通过读取对应的 Manifest 清单来寻找软件,然后才能下载和安装软件,而 winget-pkgs 就是维护 Manifest 清单的 Repo。
比如我想安装 Postman, WinGet 就会做如下事情:
  • 找到当前源(软件仓库)中的 Manifest 清单文件

  • 按照 Manifest 规定完成准备工作

  • 按照 Manifest 规定执行安装步骤

  • 按照 Manifest 设定完成善后工作

图源:少数派
举个例子:你打算安个 360 安全卫士

winget install 360安全卫士 
正在添加依赖:360浏览器 正在添加依赖:360杀毒 

1. WinGet 安装方法:
法1:提交 WinGet 的预览体验申请,Win10 商店下载
法2:申请加入 Windows Insider,Win10 商店下载
法3:GitHub下载安装包直接安装
推荐法3,简单直接, 在 GitHub 搜索 WinGet,microsoft/winget-cli 就是该项目。在 releases 页面下载名为 Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.appxbundle 的软件安装包。
下载后双击即可安装成功。
2. 使用 WinGet
安装 应用安装程序 后,可以通过在命令提示符下键入 “winget” 来运行 WinGet 。最常见的使用场景之一是搜索并安装你最喜欢的工具。若要搜索某个工具,请键入 winget search \<appname>
确认你需要的工具可用后,可以通过键入 winget install \<appname> 来安装该工具。 WinGet 工具会启动安装程序,将应用程序安装在你的电脑上。
比如搜索并安装我们前一阵介绍的 PowerToys:

除了安装和搜索外, WinGet 还提供了许多其他命令,用来 显示应用程序详细信息, 更改源以及 验证程序包。若要获取完整的命令列表,请键入 winget --help

命令

WinGet 工具的当前预览版支持以下命令。
  命令
  说明
hash
为安装程序生成 SHA256 哈希。
help
显示 winget 工具命令的帮助信息。
install
安装指定的应用程序。
search
搜索某个应用程序。
show
显示指定应用程序的详细信息。
source
添加、删除和更新 winget 工具访问的 Windows 程序包管理器存储库。
validate
验证要提交到 Windows 程序包管理器存储库的清单文件。

选项

WinGet 工具的当前预览版支持以下选项。
  选项
  说明
-v、--version
此选项返回 winget 的当前版本。
--info
info 提供有关 winget 的所有详细信息,包括许可证和隐私声明的链接。
-?、--help
获取有关 winget 的更多帮助信息

彩(虹)蛋

安装命令后加 --rainbow,可以看到彩虹进度条,是不是很骚 
当然你可以通过winget settings将彩虹进度条设置为默认,就不用打--rainbow了
支持的安装程序格式
winget 工具的当前预览版支持以下类型的安装程序
  • EXE
  • MSIX
  • MSI

编写 winget 脚本

可以编写批处理脚本和 powershell 脚本来安装多个应用程序。
可能以后装机用得上:
@echo off
Echo Install Powertoys and Terminal
REM Powertoys
winget install Microsoft.Powertoys
if %ERRORLEVEL% EQU 0 Echo Powertoys installed successfully.
REM Terminal
winget install Microsoft.WindowsTerminal
if %ERRORLEVEL% EQU 0 Echo Terminal installed successfully. %ERRORLEVEL%
注:使用脚本时, WinGet 会按指定顺序启动应用程序。当安装程序返回成功或失败时, WinGet 会启动下一个安装程序。如果某个安装程序启动了另一进程,它可能会提前返回到 WinGet 。这会导致 WinGet 在上一个安装程序完成之前安装下一个安装程序。
如果没有你想要的软件
如果官方源未包含你的工具或应用程序, 你可以将程序包提交到官方的存储库。添加你最喜爱的工具后,你和其他人都可以使用它。
官方存储库,也就是官方源的地址:https://github.com/microsoft/winget-pkgs
官方源(存储库)长这样(更新频繁):
官方欢迎你提交自己编写的 manifest,以解压软件7Zip为例,manifest长这样:它包含了下载地址,Sha256校验码等关键信息:
Id: 7zip.7zip
Name: 7Zip
AppMoniker: 7zip
Version: 19.0.0
Publisher: 7zip
Author: 7zip
License: Copyright (C) 1999-2020 Igor Pavlov. - GNU LGPL
LicenseUrl: https://7-zip.org/license.txt
MinOSVersion: 10.0.0.0
Homepage: https://www.7-zip.org/
Description: Free and open source file archiver with a high compression ratio.
Tags: "7zip,compression,file compression,utility,tool,zip"
InstallerType: msi
Installers:
  - Arch: x64
    Url: https://www.7-zip.org/a/7z1900-x64.msi
    Sha256: A7803233EEDB6A4B59B3024CCF9292A6FFFB94507DC998AA67C5B745D197A5DC
    Switches:
      Silent: /quiet /norestart
      SilentWithProgress: /passive /norestart

3. 实验功能体验
输入:winget features,会给出所有 WinGet 上的实验功能,显示如下:
默认状态下,实验性功能是禁用状态,WinGet 提示我们打开 settings(输入 WinGet settings 即可), 类似于 vscode,WinGet 的设置也通过 json 来进行配置
默认的设置项是空的:
其中,对于自动补全功能,需要额外对 Powershell 进行如下配置:
配置过程如下:
首先给Powershell创建一个$profile
$profile主要用于个性化常用的函数、别名等等。每次加载powershell的时候,都会执行profile中的内容。
查看是否有profile:
$profile
如果结果是false说明没有。则创建一个。
New-Item –Path $Profile –Type File –Force
Register-ArgumentCompleter -Native -CommandName winget -ScriptBlock {
  param($wordToComplete, $commandAst, $cursorPosition)
      [Console]::InputEncoding = [Console]::OutputEncoding = $OutputEncoding = [System.Text.Utf8Encoding]::new()
      $Local:word = $wordToComplete.Replace('"', '""')
      $Local:ast = $commandAst.ToString().Replace('"', '""')
      winget complete --word="$Local:word" --commandline "$Local:ast" --position $cursorPosition | ForEach-Object {
          [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
      }
}
对Powershell的配置就完成了
目前支持的自动补全如下(⇥ 代表tab键):



winget ⇥
winget install
install is the first command below the root
winget sh⇥
winget show
show is the first command that starts with sh
winget source l⇥
winget source list
list is the first sub-command of source that starts with l
winget -⇥
winget --version
--version is the first argument defined for the root
winget install power⇥
winget install "Power Toys"
"Power Toys" is the first package whose Id, Name, or Moniker starts with power
winget install "Power Toys" --version ⇥
winget install "Power Toys" --version 0.19.2
0.19.2 is the highest version of Power Toys at the time of writing
之后我们可以检验自动补全的效果
其它功能就不需要额外配置 powershell 了,只需要在 settings 设置完成即可:
比如我想开启list功能,自动补全功能,进行如下的设置:
我们配置完 settings 文件后,再输入 winget features 来查看实验性功能的开启情况:
你可能注意到,甚至 list 命令和 upgrade 命令都是实验性功能,可见其不够完善。
目前比较操蛋的是 WinGet 竟然还没有卸载功能,老逛测试时该项目已经发布半年多了。
后来老逛发现了它的官方路线图,原来到 2021 年 5 月份,我们才能得到一个基本可用的 1.0 版本。
4. Scoop和Chocolately

上文提到,之前在 Windows 平台上,已经有了两个不错的包管理工具:Chocolatey 以及 Scoop,Chocolatey 的自我定位是 Windows 系统的软件管理自动化。它能够在无需人工干预的情况下自动安装超过 20 种 Windows 软件包类型,而且开箱即用,支持配置超过 7000 款主流软件,包括 Google Chrome 和 VLC 多媒体播放器等桌面热门应用程序。

Scoop 同样可以通过单命令安装 Windows 软件,不过它的适用目标相对来说更狭窄,也更有针对性。这款软件包管理工具更多的时候是帮助开发者安装系统工具时使用,尤其是那些依赖于 Linux 但在 Windows 系统上不存在的软件程序。

两款软件包安装程序都有各自的优缺点,所以需要根据自己的需求进行选择。如果想快速简单地安装熟悉的 Windows 程序,那么 Chocolatey 可能适合你。

其广泛的社区驱动的软件包存储库意味着无需额外配置的情况下,你就可以找到几乎所有流行的 Windows 程序。

这两个成熟的工具都比 WinGet 要完善,在现阶段,如果你想在 Windows 上体验包管理工具,老逛建议还是 scoop+chocolately 吧。

因为今天这篇文章是介绍 WinGet,推荐两篇文章介绍这两个工具,我就不多赘述了。

Scoop:  https://sspai.com/post/52496

Chocolately: https://sspai.com/post/55309

5. 总结
WinGet 于 5 月 29 在微软的 Build 2020 上发布,历时大半年 ,老逛在 2020 年末体验了一遍 WinGet,甚至没有卸载功能。
目前功能还非常有限,毕竟还处于预览体验阶段,但是因为它有官方 buff 的加持,我还是希望它越来越好,甚至希望有天它能像 Linux子系统(WSL)一样集成到官方系统中,给 Windows 平台的用户带来稳定易用的体验。
‍‍‍‍‍我觉得我们还是要宽容吧,准官方的 Windows 包管理工具在不断进化中,如果你喜欢开源项目,并且希望推动 WinGet 的发展,可以使用 WinGet 并在官方 Github 提出issue,开源社区万岁!
比如,刚提到的 list (列出已安装软件)及 upgrade (升级软件)的功能,也是开发人员回复并落实了用户提出的 issue。
参考链接
[1] https://sspai.com/post/60592 作者:SpencerWoo
[2] https://sspai.com/post/60597 作者:stevapple
[3] https://docs.microsoft.com/zh-cn/windows/package-manager/
[4] https://github.com/microsoft/winget-cli
推荐阅读

0. 逛逛GitHub交流群限时加入

1. IntelliJ IDEA 从入门到上瘾!

2. 手机抓包!

3. 干掉马赛克!

4. GitHub 暗黑模式终于来了!


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存