热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

乘风破浪,遇见最美Windows11之现代Windows桌面应用开发–Windows程序包管理器(Winget)

什么是Windows程序包管理器(Winget)https:docs.microsoft.comzh-cnwindowspackage-managerWindows程序包管理器(W

什么是Windows程序包管理器(Winget)


https://docs.microsoft.com/zh-cn/windows/package-manager/


Windows程序包管理器(Windows Package Manager,简称Winget)是一个综合的程序包管理器解决方案,由一个命令行工具和一组用于在Windows 10/11上安装应用程序的服务组成。它由一个命令行实用程序(CLI)和一组安装应用程序的服务组成。独立软件供应商可以将其作为软件包的分发渠道。


为什么需要Winget

通常来说,在Windows上我们要安装和下载软件,可能会打开搜索引擎去搜索它,有经验的人可以快速识别软件的官网,而其他小白,可能会前往各种充满广告或陷阱的下载站,甚至最终折腾下来下载到的是夹带了木马的软件,好不容易得到安装包,我们还要经受一轮选择题的考验,不断地下一步安装流程和稍不留神就中招的默认勾选项,都会让你肉颤心惊,过五关,斩六将,即使身经百战的高手也不见得每次都可以毫发无损的完成安装。

image

而且,如果是有一百台电脑需要部署,那么重复上诉流程会让人感到奔溃,效率极其低下。

那么在Linux上,通常怎么解决上诉问题的?比如我们熟悉的Linux发行版Ubuntu、Linux Mint、Elementary OS的母版都是具有强健包管理器的Debian系统,它的每个组件和应用程序都内置在系统中安装的软件包中,Debian使用一套名为Advanced Packaging ToolAPT)的工具来管理这种包系统。

image


大多数现代类Unix操作系统都提供了一个集中的软件包管理机制,以帮助用户搜索、安装和管理软件。而软件通常以包的形式存储在仓库(Repository)中,对软件包的使用和管理被称为包管理。而Linux包的基本组成部分通常有:共享库、应用程序、服务和文档。


所以,如果在Windows上也拥有一套包管理器,那么搜索、安装、管理软件的效率会翻几倍,而且还更加安全。


Winget正是这么响应时代的号召而生,为更高效安全的软件维护而生。



Winget社区包源


https://github.com/microsoft/winget-pkgs


"Winget-Cli客户端"时围绕包源的概念构建的,由包源提供发现和检索有关包元数据的能力,使"Winget-Cli客户端"能采取相应的动作。

默认来源是来自"Windows Package Manager Community Repository"社区提供的数据。


安装Winget


https://github.com/microsoft/winget-cli/ 开源软件,贡献力量,你必须先同意并签署Microsoft CLA



商店安装(推荐)


要求Windows 10 1809 (build 17763) 及更新版本,或者Windows 11全部版本


Winget的商店版是内置到"应用安装程序(App Installer)"中的,所以从商店我们只需要安装最新的"应用安装程序(App Installer)"即可,Winget的更新也将随"应用安装程序(App Installer)"商店版一起更新。



  • 应用安装程序(App Installer) From Microsoft Store

ms-windows-store://pdp/?productid=9NBLGGH4NNS1

image

如果已安装,请确保更新到最新版本。


手动安装


https://github.com/microsoft/winget-cli/releases


和商店版相同的发布包也将Winget-Cli项目GitHub Releases处被发布,这里我们找到.msixbundle格式的安装包文件进行下载安装。



  • Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle

image

下载完成之后,双击安装。

image


在一些较老的Windows 10版本,如果你安装遇到了错误提示,可能你还需要额外安装"适用于开发人员的C++运行时框架桌面桥(VC++ v14 Desktop Framework Package)",它的安装包地址如下:




  • Microsoft.VCLibs.arm.14.00.Desktop.appx

  • Microsoft.VCLibs.arm64.14.00.Desktop.appx

  • Microsoft.VCLibs.x64.14.00.Desktop.appx

  • Microsoft.VCLibs.x86.14.00.Desktop.appx


验证安装

安装成功之后,可以在"Windows终端"中通过执行如下命令来验证:

winget

image


使用Winget


通过Winget搜索软件


https://docs.microsoft.com/zh-cn/windows/package-manager/winget/search


winget search $Keyword

image

第一次使用搜索,可能提示"是否同意所有源协议条款?",这里回答Y即可。

image


默认情况下搜索不区分大小写


winget search micro

image


限定应用程序Id


winget search --id $AppId

image


限定应用名称


winget search --name $AppName

image


限定应用标记


winget search --tag $AppTag

image


按源进行筛选


winget search $Keyword -s $SoureName

image


通过Winget列举包源


https://docs.microsoft.com/zh-cn/windows/package-manager/winget/source



默认包源存储库


Windows程序包管理器会指定两个默认存储库:



  • msstore - Microsoft Store目录。

  • winget - Windows程序包管理器应用存储库。


包源协议


单个源可以请求用户在访问存储库之前同意条款。在添加或使用存储库之前,用户必须同意提供的条款。

image


列举所有包源


winget source list

image


添加指定源信息


winget source add --name $SourceName $SourceUrl

image


查看源详细信息


winget source list --name $SourceName

image


更新指定源的包索引


winget source update --name $SourceName

image


更新所有的源的包索引


winget source update

image


删除指定源


需要使用Windows终端的管理员模式执行

winget source remove --name $SourceName

image


强制重置所有的源设置


需要使用Windows终端的管理员模式执行,并且携带强制参数

winget source reset --force

image


导出源信息


winget source export --name $SourceName

image


通过Winget安装应用


https://docs.microsoft.com/zh-cn/windows/package-manager/winget/install



指定包Id进行安装


winget install --id $PackageId

例如:

winget install --id Microsoft.PowerToys

指定软件版本进行安装(--version)


winget install $PackageName -v $TargetVersion

例如:

winget install powertoys --version 0.15.2

指定包Id及包版本进行安装


winget install --id $PackageId --version $TargetVersion

例如:

winget install --id Microsoft.PowerToys --version 0.15.2

指定安装源进行安装


winget install $PackageName -s $SourceName

例如:

winget install powertoys -s msstore

image


在指定源指定Id进行安装


winget install --id $PackageId -s $SourceName

例如:

winget install --id Git.Git -e -source winget

指定字符串精确查找(--exact)


winget install $PackageName -e

以交互模式显示安装进度(--interactive)


winget install $PackageName -i

以静默模式进行安装(--silent)


winget install $PackageName -h

安装并写入日志(--log)


winget install $PackageName -o $LogFilePath

值得注意的是安装日志的默认存储位置位于:%temp%\AICLI\*.log


指定安装位置(--location)


winget install $PackageName -l $LocationPath

强制安装绕过哈希检查(--force)


winget install $PackageName --force

指定本地包描述文件进行安装(--manifest)


winget install -m $PackageManifestPath

基于本地文件安装是比较有风险的,默认不会允许,如果需要开启通过如下命令开启:

winget settings --enable LocalManifestFiles

若关闭这个权限可运行:

winget settings --disable LocalManifestFiles

对于来自微软商店的包指定Id进行安装


微软商店的包源通常采用唯一标识符作为包的Id,可以直接用程序在商店的Store Id来作为安装Id

winget install $StoreId -s msstore

例如:

winget install XP9KHM4BK9FZ7Q -s msstore

自动接受询问的安装许可协议(--accept-package-agreements)


某些应用程序在安装时要求用户在安装前同意许可协议或其他协议。发生这种情况时,Windows程序包管理器会提示用户同意协议。如果用户不同意,则应用程序不会安装,编写脚本可以用到它。

winget install $PackageName --accept-package-agreements

例如:

winget install XP9KHM4BK9FZ7Q --accept-package-agreements -s msstore

自动接受询问的源许可协议(--accept-source-agreements)


对于有些包源第一次使用时,是会询问源许可协议的,如果需要自动接受它,可以用这个参数,编写脚本可以用到它。

winget install $PackageName --accept-source-agreements

例如:

winget install XP9KHM4BK9FZ7Q --accept-source-agreements -s msstore

使用彩虹样式进度条(--rainbow)


携带参数--rainbow可以在安装时使用彩虹样式的进度条。

winget install $PackageName --rainbow

例如:

winget install Microsoft.dotNetFramework --version 4.7.1 --rainbow

image


通过Winget卸载应用


https://docs.microsoft.com/zh-cn/windows/package-manager/winget/uninstall



指定应用Id进行卸载


winget uninstall --id "$AppId"

image

如果你不知道当前应用的Id,可以先通过List来获取,从结果中可获取到该应用的Id

winget list $AppName

image


指定应用名称和版本进行卸载


winget uninstall --name $AppName --version $AppVersion

自动接受询问的源许可协议(--accept-source-agreements)


winget uninstall --id "$AppId" --accept-source-agreements

指定字符串精确查找(--exact)


winget uninstall --id "$AppId" -e

以交互模式显示卸载进度(--interactive)


winget uninstall --id "$AppId" -i

以静默模式进行卸载(--silent)


winget uninstall --id "$AppId" -h

卸载并写入日志(--log)


winget uninstall --id "$AppId" -o $LogFilePath

值得注意的是安装日志的默认存储位置位于:%temp%\AICLI\*.log


通过Winget升级应用


https://docs.microsoft.com/zh-cn/windows/package-manager/winget/upgrade



指定应用Id进行升级


winget upgrade --id "$AppId"

image

如果你不知道当前应用的Id,可以先通过List来获取,从结果中可获取到该应用的Id

winget list $AppName

image


指定应用名称和版本进行升级


winget upgrade $AppName --version $AppVersion

升级所有的已安装应用


将所有可用的包更新为最新的应用程序

winget upgrade --all

image


自动接受询问的升级许可协议(--accept-package-agreements)


某些应用程序在升级时要求用户在安装前同意许可协议或其他协议。发生这种情况时,Windows程序包管理器会提示用户同意协议。如果用户不同意,则应用程序不会升级,编写脚本可以用到它。

winget upgrade --id "$AppId" --accept-package-agreements

例如:

winget upgrade --id "XP9KHM4BK9FZ7Q" --accept-package-agreements -s msstore

自动接受询问的源许可协议(--accept-source-agreements)


对于有些包源第一次使用时,是会询问源许可协议的,如果需要自动接受它,可以用这个参数,编写脚本可以用到它。

winget upgrade --id "$AppId" --accept-source-agreements

例如:

winget upgrade --id "XP9KHM4BK9FZ7Q" --accept-source-agreements -s msstore

通过Winget获取应用详情


https://docs.microsoft.com/zh-cn/windows/package-manager/winget/show



指定应用Id进行获取应用详情


winget show --id "$AppId"

image

如果你不知道当前应用的Id,可以先通过List来获取,从结果中可获取到该应用的Id

winget list $AppName

image


应用详情元数据清单




































































说明
Id应用程序的ID。
名称应用程序的名称。
Publisher应用程序的发布者。
版本应用程序的版本。
Author应用程序的作者。
AppMoniker应用程序的AppMoniker。
描述应用程序的说明。
许可证应用程序的许可证。
LicenseUrl应用程序的许可证文件的URL。
Homepage应用程序的主页。
Tags为协助搜索提供的标记。
命令应用程序支持的命令。
Channel有关应用程序是预览版还是发行版的详细信息。
Minimum OS Version应用程序支持的最低OS版本。

安装程序详细信息




































说明
Arch安装程序的体系结构。
语言安装程序的语言。
Installer Type安装程序的类型。
Download Url安装程序的URL。
Hash安装程序的Sha-256。
Scope显示安装程序是针对每台计算机还是针对每个用户。

通过Winget创建文件哈希


https://docs.microsoft.com/zh-cn/windows/package-manager/winget/hash



指定本地文件创建文件哈希(--file)


winget hash -f $AppFilePath

image


指定本地文件创建哈希和签名SHA256(--msix)


指定hash命令还会创建可以与MSIX安装程序配合使用的SHA 256 SignatureSha256

winget hash -m -f $AppFilePath

image


通过Winget实验性功能


https://docs.microsoft.com/zh-cn/windows/package-manager/winget/features



查看实验性功能


winget features

image


通过Winget设置功能


https://docs.microsoft.com/zh-cn/windows/package-manager/winget/settings



设置配置文件位置


%LOCALAPPDATA%\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\LocalState\settings.json

或者

%LOCALAPPDATA%\Microsoft\WinGet\Settings\settings.json

打开设置文件


winget settings

image


开启某项功能(--enable)


winget settings --enable $FeatureName

关闭某项功能(--disable)


winget settings --disable $FeatureName

通过Winget验证清单


https://docs.microsoft.com/zh-cn/windows/package-manager/winget/validate



验证指定路径清单文件(--manifest)


winget validate --manifest $ManifestFilePath

image


调式Winget


https://docs.microsoft.com/zh-cn/windows/package-manager/winget/troubleshooting



日志位置

默认情况下,Windows程序包管理器会在执行命令时创建日志文件。这些日志文件位于此处:

%LOCALAPPDATA%\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\LocalState\DiagOutputDir

提供更加详细日志(--verbose-logs)

可以在原命令尾部追加--verbose-logs,可以记录更全面的日志文件(它们提供与CDN和源的完整通信)。

例如:

winget install vscode --verbose-logs
winget search -n visual --verbose-logs
winget source add -n mysource -t Microsoft.REST -a https://www.contoso.org --verbose-logs

编写批量安装的脚本

可以编写批处理脚本和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在上一个安装程序完成之前安装下一个安装程序。



Winget安全策略


管理员权限

安装程序的行为可能会有所不同,具体取决于你是否是以管理员权限运行winget。



  • 在没有管理员权限的情况下运行winget时,某些应用程序可能会要求提升权限才能进行安装。当安装程序运行时,Windows会提示你提升权限。如果你选择不提升权限,则应用程序无法进行安装。

  • 在管理员命令提示符下运行winget时,如果应用程序要求你提升权限,你不会看到提升权限提示。以管理员身份运行命令提示符时请务必小心,仅安装你信任的应用程序。


支持的安装程序格式

winget工具的当前预览版支持以下类型的安装程序:



  • EXE

  • MSIX

  • MSI


创建并发布Winget源包


https://github.com/microsoft/winget-create



创建程序包清单


https://docs.microsoft.com/zh-cn/windows/package-manager/package/manifest


a. 学习构建程序包清单的YAML格式

如果要将软件包提交到Windows程序包管理器存储库,请首先创建程序包清单。清单是描述要安装的应用程序的YAML文件,之所以选择YAML格式作为程序包清单格式,是因为人类可以相当容易地阅读它,并且这样可与其他Microsoft开发工具保持一致。


如果不熟悉YAML语法,可以通过在Y分钟内学会YAML来学习基础知识。


程序包清单必须包含一组必需的项,还可以进一步包含可选项以帮助改善客户在安装软件时的体验。清单文件中的每个字段都必须采用Pascal大小写形式,并且不能重复。

b. Yaml格式清单最小结构

PackageIdentifier: # Publisher.package format.
PackageVersion: # Version numbering format.
PackageLocale: # BCP 47 format (e.g. en-US)
Publisher: # The name of the publisher.
PackageName: # The name of the application.
License: # The license of the application.
ShortDescription: # The description of the application.
Installers:
- Architecture: # Enumeration of supported architectures.
InstallerType: # Enumeration of supported installer types (exe, msi, msix, inno, wix, nullsoft, appx).
InstallerUrl: # Path to download installation file.
InstallerSha256: # SHA256 calculated from installer.
ManifestType: # The manifest file type
ManifestVersion: 1.0.0

比如:


路径:manifests/m/Microsoft/WindowsTerminal/1.6.10571.0/Microsoft.WindowsTerminal.yaml


PackageIdentifier: Microsoft.WindowsTerminal
PackageVersion: 1.6.10571.0
PackageLocale: en-US
Publisher: Microsoft
PackageName: Windows Terminal
License: MIT
ShortDescription: The new Windows Terminal, a tabbed command line experience for Windows.
Installers:
- Architecture: x64
InstallerType: msix
InstallerUrl: https://github.com/microsoft/terminal/releases/download/v1.6.10571.0/Microsoft.WindowsTerminal_1.6.10571.0_8wekyb3d8bbwe.msixbundle
InstallerSha256: 092aa89b1881e058d31b1a8d88f31bb298b5810afbba25c5cb341cfa4904d843
SignatureSha256: e53f48473621390c8243ada6345826af7c713cf1f4bbbf0d030599d1e4c175ee
ManifestType: singleton
ManifestVersion: 1.0.0

c. 多个清单文件

为了提供最佳用户体验,清单应包含尽可能多的元数据。为了区分验证安装程序和提供本地化元数据的问题,应将清单拆分为多个文件。此类清单至少需要3个YAML文件。还应提供其他区域设置。



  • 一个版本文件。

  • 一个默认区域设置文件。

  • 一个安装程序文件。

  • 其他区域设置文件。

例如一个版本文件


路径:manifests/m/Microsoft/WindowsTerminal/1.6.10571.0/Microsoft.WindowsTerminal.yaml


PackageIdentifier: "Microsoft.WindowsTerminal"
PackageVersion: "1.6.10571.0"
DefaultLocale: "en-US"
ManifestType: "version"
ManifestVersion: "1.0.0"

例如一个默认区域设置文件


路径:manifests/m/Microsoft/WindowsTerminal/1.6.10571.0/Microsoft.WindowsTerminal.locale.en-US.yaml


PackageIdentifier: "Microsoft.WindowsTerminal"
PackageVersion: "1.6.10571.0"
PackageLocale: "en-US"
Publisher: "Microsoft"
PublisherUrl: "https://www.microsoft.com/"
PrivacyUrl: "https://privacy.microsoft.com/"
PackageName: "Windows Terminal"
PackageUrl: "https://docs.microsoft.com/windows/terminal/"
License: "MIT"
LicenseUrl: "https://github.com/microsoft/terminal/blob/master/LICENSE"
ShortDescription: "The new Windows Terminal, a tabbed command line experience for Windows."
Tags:
- "Console"
- "Command-Line"
- "Shell"
- "Command-Prompt"
- "PowerShell"
- "WSL"
- "Developer-Tools"
- "Utilities"
- "cli"
- "cmd"
- "ps"
- "terminal"
ManifestType: "defaultLocale"
ManifestVersion: "1.0.0"

例如一个其他区域设置文件


路径:manifests/m/Microsoft/WindowsTerminal/1.6.10571.0/Microsoft.WindowsTerminal.locale.fr-FR.yaml


PackageIdentifier: "Microsoft.WindowsTerminal"
PackageVersion: "1.6.10571.0"
PackageLocale: "fr-FR"
Publisher: "Microsoft"
ShortDescription: "Le nouveau terminal Windows, une expérience de ligne de commande à onglets pour Windows."
ManifestType: "locale"
ManifestVersion: "1.0.0"

例如一个安装程序文件


路径:manifests/m/Microsoft/WindowsTerminal/1.6.10571.0/Microsoft.WindowsTerminal.installer.yaml


PackageIdentifier: "Microsoft.WindowsTerminal"
PackageVersion: "1.6.10571.0"
Platform:
- "Windows.Desktop"
MinimumOSVersion: "10.0.18362.0"
InstallerType: "msix"
InstallModes:
- "silent"
PackageFamilyName: "Microsoft.WindowsTerminal_8wekyb3d8bbwe"
Installers:
- Architecture: "x64"
InstallerUrl: "https://github.com/microsoft/terminal/releases/download/v1.6.10571.0/Microsoft.WindowsTerminal_1.6.10571.0_8wekyb3d8bbwe.msixbundle"
InstallerSha256: 092aa89b1881e058d31b1a8d88f31bb298b5810afbba25c5cb341cfa4904d843
SignatureSha256: e53f48473621390c8243ada6345826af7c713cf1f4bbbf0d030599d1e4c175ee
- Architecture: "arm64"
InstallerUrl: "https://github.com/microsoft/terminal/releases/download/v1.6.10571.0/Microsoft.WindowsTerminal_1.6.10571.0_8wekyb3d8bbwe.msixbundle"
InstallerSha256: 092aa89b1881e058d31b1a8d88f31bb298b5810afbba25c5cb341cfa4904d843
SignatureSha256: e53f48473621390c8243ada6345826af7c713cf1f4bbbf0d030599d1e4c175ee
- Architecture: "x86"
InstallerUrl: "https://github.com/microsoft/terminal/releases/download/v1.6.10571.0/Microsoft.WindowsTerminal_1.6.10571.0_8wekyb3d8bbwe.msixbundle"
InstallerSha256: 092aa89b1881e058d31b1a8d88f31bb298b5810afbba25c5cb341cfa4904d843
SignatureSha256: e53f48473621390c8243ada6345826af7c713cf1f4bbbf0d030599d1e4c175ee
ManifestType: "installer"
ManifestVersion: "1.0.0"

举个实际的例子(Microsoft.TeamsPreview)

PackageIdentifier: Microsoft.TeamsPreview
PackageName: Microsoft Teams Preview
Moniker: teams-preview
PackageVersion: 1.4.00.9773
Publisher: Microsoft Corporation
Author: Microsoft Corporation
License: (c) 2021 Microsoft Corporation
LicenseUrl: https://www.microsoft.com/en-us/legal/intellectualproperty/copyright/default
ShortDescription: Meet, chat, call, and collaborate in just one place.
PackageUrl: https://www.microsoft.com/en-us/microsoft-teams/group-chat-software
Installers:
- Architecture: x64
InstallerUrl: https://statics.teams.cdn.office.net/production-windows-x64/1.4.00.9773/Teams_windows_x64.exe
InstallerSha256: f506a167b22437bbfd56316f7a038dc70b2b873dba875f65547a640d84539e73
InstallerType: exe
InstallerSwitches:
Silent: /s
SilentWithProgress: /s
PackageLocale: en-US
ManifestType: singleton
ManifestVersion: 1.0.0

d. 采用不同打包程序实现静默安装参数
































安装程序命令文档
MSI/qMSI命令行选项
InstallShield/sInstallShield命令行参数
Inno/SILENT or /VERYSILENTInno设置文档
Nullsoft/SNullsoft无提示安装程序/卸载程序

e. 技巧与最佳做法



  • 包标识符必须是唯一的。 不能有多个具有相同程序包标识符的提交。每个包版本只允许一个拉取请求。

  • 请避免创建多个发布者文件夹。 例如,如果已有“Contoso”文件夹,则不要创建“ContosoLtd.”。

  • 所有工具都必须支持静默安装。 如果可执行文件不支持静默安装,这时我们就无法提供该工具。

  • 请提供尽可能多的字段。 提供的元数据越多,用户体验就越好。在某些情况下,Windows程序包管理器客户端(winget.exe)可能尚不支持这些字段。例如,AppMoniker字段是可选的。但是,如果你包含此字段,则客户在执行搜索命令(例如,用vscode来表示Visual Studio Code)时会看到与AppMoniker值关联的结果。如果只有一个应用具有指定的AppMoniker值,则客户可以通过指定名字对象(而不是完全限定的包标识符)来安装应用程序。

  • 此规范中字符串的换行长度应限制为100个字符。

  • PackageName应匹配“添加/删除程序”中产生的条目来帮助关联清单,以支持导出和升级。

  • Publisher应匹配“添加/删除程序”中产生的条目来帮助关联清单,以支持导出和升级。

  • MSI格式的包安装程序使用产品代码来对应用程序进行唯一标识。给定版本的包的产品代码应包含在清单中,以帮助确保最佳的升级体验。

  • 将清单中字符串的换行长度限制为100个字符。

  • 当程序包的指定版本存在多个安装程序类型时,可以在每个Installers下放置InstallerType的一个实例。


验证程序包清单

我们可以先通过winget的validate在本地完成基础的验证,它将验证我们是否符合前面提到的存储库中的清单规范(https://github.com/microsoft/winget-cli/blob/master/doc/ManifestSpecv1.0.md)。

winget validate --manifest $ManifestFilePath

image


发布程序包清单

a. 创建Windows程序包管理器存储库的分支

前往Windows程序包管理器存储库项目主页,点击分支(Fork)按钮,创建一个分支。

image

image

image

b. 克隆并拉取分支

在创建后的分支的主页,点击代码(Code)按钮,复制HTTPs或者SSH的地址,通过git clone命令在本地进行克隆和拉取。

git clone https://github.com/YourAccount/winget-pkgs.git

image

c. 按约定路径添加清单文件

`manifests` / `letter` / `publisher` / `application` / `version` / `Yaml file`

其中:



  • manifests文件夹是存储库中所有清单的根文件夹。

  • letter文件夹是发布者名称的首字母。

  • publisher文件夹是发布软件的公司的名称。例如:Microsoft

  • application文件夹是应用程序或工具的名称。例如:VSCode

  • version文件夹是应用程序或工具的版本。例如:1.0.0

  • YamlFile是清单的文件名。此文件名必须设置为应用程序的名称和发布者。例如:Contoso.ContosoApp.yaml

注意:

清单中的PackageIdentifier值必须与清单文件夹路径中的发布者应用程序名称相匹配,并且清单中的PackageVersion值必须与文件名中的版本相匹配。

PackageIdentifier: Microsoft.MSIXPackagingTool
PackageVersion: 1.2021.422.0

比如:

manifests\m\Microsoft\MSIXPackagingTool.2021.422.0\Microsoft.MSIXPackagingTool.yaml

image

d. Git添加并推送到远程

如果你用Visual Studio Code的来编辑最好用自带的来完成。

image

image

或者基于如下命令行的步骤



  1. 通过Git Add添加新增的Yaml文件:

git add manifests\m\Microsoft\MSIXPackagingTool.2021.423.0\Microsoft.MSIXPackagingTool.yaml


  1. 通过Git Commit提交更新内容:

git commit -m "Submitting Microsoft.MSIXPackagingTool version 1.2021.423.0.yaml"


  1. 通过Git Push将本地修改推送到远程仓库

git push

e. 创建合并请求PR(Fork方式)

如果你是通过Fork的方式操作的,前往我们Fork后的项目的主页,找到pull requests页面,点击"创建新拉取合并(new pull request)"。

image

接下来,我们将看到Change Files,确认没有问题之后,我们点击右侧的"创建拉取(Create Pull Request)"按钮

image

它将提示我们从Fork分支创建一个合并请求到原始项目

image

接下来,Open a Pull request页面,我们将看到填写描述的地方,这里可以描述一下,没问题之后,点击"创建拉取(Create Pull Request)"按钮

image

接下来,会进入提交的流程,机器人会先介入。

image

f. 创建合并请求PR(Branch方式)

如果你是采用在原项目上新建分支的方式来操作的,在原仓库项目的主页,找到pull requests页面,点击"创建新拉取合并(new pull request)"。

image

g. 签署贡献者授权协议

第一次,机器人可能会提示你,你还没有签署存储库的贡献者授权协议,那么这里我们可以点击Sign Now处理下。

image

image

image

image

image

image

h.回答提交问卷

image

i.查看提交验证流程

image


对提交的预期和建议

提交到Windows程序包管理器存储库的所有应用程序都应表现良好,并遵循Windows程序包管理器存储库策略。下面是对提交的一些预期:



  • 清单符合架构要求。

  • 清单中的所有URL都通向安全的网站。

  • 安装程序和应用程序中没有病毒。程序包可能会被错误地标识为恶意软件。如果你认为这是一个误报,可以将安装程序提交给Microsoft Defender团队以便进行分析。

  • 对于管理员和非管理员,应用程序都可以正确地安装和卸载。

  • 安装程序支持非交互模式。

  • 所有清单条目都准确且没有误导性。

  • 安装程序直接来自发布者的网站。


参考



  • Windows 程序包管理器

  • Windows 包管理器——winget 上手教程

  • linux软件包管理器

  • 5款最适合新手的包管理器

  • 5 个给 Linux 新手的最佳包管理器

  • Windows 软件包管理器 WinGet 添加 “卸载程序”功能

  • 微软 Windows 软件包管理器 winget 1.0 正式发布

  • Windows Package Manager 1.0

  • WinGet Manifests Auto-Updater

  • 在 Windows 10 上安装软件,你现在可以用微软的包管理工具了:WinGet



推荐阅读
  • 主流操作系统简介
    主流操作系统简介子墨居士操作系统理论定义为管理计算机硬件资源,控制其他程序运行并为用户提供交互操作界面的系统软件的集合。操作系统是计算机系统的关键组成部分࿰ ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • Linux下安装免费杀毒软件ClamAV及使用方法
    本文介绍了在Linux系统下安装免费杀毒软件ClamAV的方法,并提供了使用该软件更新病毒库和进行病毒扫描的指令参数。同时还提供了官方安装文档和下载地址。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • 本文介绍了在Linux中执行.sh脚本时出现/bin/sh^M: bad interpreter: No such file or directory异常的原因分析,并提供了两种解决方法:在Windows下进行编码格式转换,或在Linux中修改文件格式和执行权限。具体操作步骤也在摘要中给出。 ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • docker安装到基本使用
    记录docker概念,安装及入门日常使用Docker安装查看官方文档,在"Debian上安装Docker",其他平台在"这里查 ... [详细]
  • python3.7 安装pip3_python3的pip3安装
    ---恢复内容开始---pip3的安装需要对应一整套python的编译工具库,所以安装好的pip3是这个样子:inearAi:~$pip3-Vpi ... [详细]
  • Linux下ODBC安装配置
    Linux下ODBC安装配置ODBC原理ODBC是 ... [详细]
  • 系统安装Debian系统的安装方式和Ubuntu系统的安装方式几乎是一样的,毕竟Ubuntu系统是基于Debian的,就如同CentOS基于Redhat ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了在CentOS 6.4系统中更新源地址的方法,包括备份现有源文件、下载163源、修改文件名、更新列表和系统,并提供了相应的命令。 ... [详细]
author-avatar
seazz2001
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有