winget 源代码库的结构

dan*_*1st 12 windows cmd package-managers winget

微软宣布并开源了windows的包管理器winget

进入时winget source(安装后),可以看到支持添加源。

winget source 提供以下子命令:

add     Add a new source
list    list current sources
update  updates current sources
remove  removes current sources
reset   resets sources
Run Code Online (Sandbox Code Playgroud)

通过输入winget source list,将显示默认源(只要源未更改):

C:\Windows\System32>winget source list
Name   Arg
-----------------------------------------
winget https://winget.azureedge.net/cache
Run Code Online (Sandbox Code Playgroud)

由于可以使用 添加winget source add源,如何创建源存储库?

存储库必须如何构建,或者是否没有足够的文档来回答这个问题?


我认为这个问题是 Stack Overflow 的主题,因为添加源的主要原因是(在我看来)为程序或类似程序创建 alpha/beta 通道。

小智 9

winget 1.0为自定义存储库引入了新的 REST APIMicrosoft 在github.com/microsoft/winget-cli-restsource/上提供了 API 和参考实现。参考实现使用 C# 并允许在 Azure 上自托管。托管产品也正在变得可用,例如https://winget.pro

在 winget 1.0 之前,winget 存储库的结构大致如下:

  1. 远程存储库应该有一个source.msix文件。您可以参考默认存储库中的示例:https://winget.azureedge.net/cache/source.msix

  2. 人们可以在Microsoft Docs 网站上找到有关 MSIX 本身的详细信息。

  3. 实际上,这source.msix是一个 zip 包,其内容以预定义的方式构建(只需将其重命名为source.zip并解压):

    • Assets/
    • Public/
    • AppxBlockMap.xml
    • AppxManifest.xml
    • AppcSignature.p7x
    • [Content_Typex.xml]
  4. 主要数据文件似乎是Public/index.db. 它是一个 SQLite 数据库,包含源自社区存储库清单的信息。它的结构非常简单易懂。

  5. 另一个问题是 MSIX 应由开发人员签名。人们应该更改 Windows 设置才能winget接受第三方签名的包。详情请参阅下文。

  6. 请注意,它winget不接受 HTTP 存储库,它只需要具有受信任证书的 HTTPS 存储库。

  7. 最有趣的表index.dbmanifestpathparts。第一个将应用程序的名称、版本等与路径部分匹配,后者指向清单 YAML 文件。

    例如:https://winget.azureedge.net/cache/manifests/RubyInstallerTeam/Ruby/e70d-2.7.2.yaml ( github/winget-pkgs/manifests/RubyInstallerTeam/Ruby/2.7.2.yaml的缓存) 。

  8. winget使用此缓存的清单进行应用程序安装。

  9. 为了winget添加第三方源存储库(当source.msix由第三方证书签名时),应该允许安装旁加载应用程序。

Windows 设置

  1. 总结以上内容,总体顺序如下:

    • source.msixwinget默认存储库下载: https ://winget.azureedge.net/cache/source.msix
    • 将其解压为 ZIP 包或使用MSIX 打包工具index.db从目录中获取文件Public
    • 编辑此 SQLite DB(我为此使用了SQLite 的数据库浏览器),仅留下您的应用程序(表ids、、、)。monikersnamesversions
    • 设置表中 YAML 清单的路径pathparts(每个路径元素一条记录)。例如/manifests/MyCompany/MyProduct/1.0.0.yaml表应该是这样的: 路径部分表示例
    • manifest通过添加联合所有相关记录的记录来编辑表。
    • 保存编辑后的文件index.db,使用 MSIX 打包工具覆盖它source.msix,使用您自己的代码签名证书对 MSIX 进行签名。
    • 上传清单(有关清单本身的详细信息,请参阅清单规范source.msix)并上传到您的服务器(例如到myserver.net/repo/source.msix​​ 和myserver.net/repo/manifests/MyCompany/MyProduct/1.0.0.yaml)。
    • 使用:
    winget source add myrepo https://myserver.net/repo
    winget install MyProduct
    
    Run Code Online (Sandbox Code Playgroud)