热门标签 | 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



推荐阅读
  • 实践指南:使用Express、Create React App与MongoDB搭建React开发环境
    本文详细介绍了如何利用Express、Create React App和MongoDB构建一个高效的React应用开发环境,旨在为开发者提供一套完整的解决方案,包括环境搭建、数据模拟及前后端交互。 ... [详细]
  • Jupyter Notebook多语言环境搭建指南
    本文详细介绍了如何在Linux环境下为Jupyter Notebook配置Python、Python3、R及Go四种编程语言的环境,包括必要的软件安装和配置步骤。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 调试利器SSH隧道
    在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到 ... [详细]
  • 在现代前端开发中,组件化已成为不可或缺的技术,尤其在 React 和 Vue 生态中。然而,组件的管理和测试一直是开发者面临的挑战。本文将介绍如何使用 Storybook 来简化这一过程,提高开发效率。 ... [详细]
  • 通过网上的资料我自己的实际内核编译,我把对Linux内核编译的过程写在这里,也许对其他的Linux爱好者的编译学习有些帮助,其中很大部分是 ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • Requests库的基本使用方法
    本文介绍了Python中Requests库的基础用法,包括如何安装、GET和POST请求的实现、如何处理Cookies和Headers,以及如何解析JSON响应。相比urllib库,Requests库提供了更为简洁高效的接口来处理HTTP请求。 ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • 在OpenCV 3.1.0中实现SIFT与SURF特征检测
    本文介绍如何在OpenCV 3.1.0版本中通过Python 2.7环境使用SIFT和SURF算法进行图像特征点检测。由于这些高级功能在OpenCV 3.0.0及更高版本中被移至额外的contrib模块,因此需要特别处理才能正常使用。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • Android与JUnit集成测试实践
    本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ... [详细]
  • 在将 Android Studio 从 3.0 升级到 3.1 版本后,遇到项目无法正常编译的问题,具体错误信息为:org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:processDemoProductDebugResources'。 ... [详细]
  • 尝试使用Composer安装自定义提交的包时遇到问题,Composer报告找不到指定的包。 ... [详细]
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社区 版权所有