使用 C#和.NET 构建 CLI 应用程序:11 打包与部署

既然我们已经完成了应用程序的开发和测试,现在是时候向全世界发布了!我们需要将其打包并部署,以便分发给全球数百万用户。

每个平台(如 Windows、macOS 和 Linux)都有自己分发应用程序的方式。由于.NET 8 是跨平台的,我们可以将 Bookmarkr 分发给更多用户,无论他们使用何种平台。

不过,在打包分发应用程序之前,我们需要在每个目标平台上进行测试,这一点非常重要。

本章我们将探讨不同的打包和部署技术,帮助我们实现这一目标。具体来说,我们将完成以下工作:

  • 探索命令行应用程序在打包与分发时的不同选项
  • 学习如何打包并分发跨平台的命令行应用程序
  • 学习如何将命令行应用程序部署到多个平台
  • 学习如何管理分布式应用程序的版本

20年工作经验,成家微信小程序,网站,网站后端开发。有意向私聊我哈。

术语说明

在本章中,您将频繁遇到"打包"、"分发"和"部署"等术语。对于不熟悉这些概念的读者,以下是每个术语的简要定义:

  • 打包 :打包是指为应用程序发布做准备的过程。这包括将所有必要的文件、库和资源捆绑成单一单元,便于用户安装或执行。有效的打包能确保应用程序兼容多种环境,并简化安装流程。该过程通常涉及创建安装程序或归档文件,以简化应用程序的部署。
  • 分发 :分发是指将打包后的应用程序交付给用户的方法。这可以通过多种渠道实现,包括在线下载、物理介质(如 U 盘)或基于云的服务(如 NuGet、NPM、WinGet 和 apt-get 软件仓库)。分发的目标是让目标用户能够获取应用程序,同时确保以安全且高效的方式送达。
  • 部署 :部署是指将分发的应用程序安装到用户计算机上并使其可运行的机制。这可能涉及配置设置、与现有系统集成以及确保所有组件正常工作。部署可以手动完成,也可以通过各种工具和脚本实现自动化。其目的是让用户能够有效地访问和使用应用程序。

正如你可能已经想到的,让应用程序(包括 CLI 应用程序)对用户可用是一个三步过程,可以用此图来概括:

图11.1 - 应用程序面向用户可用的流程

既然我们已经理解了相关术语,现在就开始探讨在 CLI 应用程序的打包、分发和部署方面可用的选项。

CLI 应用程序的打包与分发选项

在打包 CLI 应用程序时,存在多种方法,选择最合适的方式取决于我们打算分发它的途径。

最常见的选项如下:

  • MSI 安装程序 :此选项提供更传统的安装体验,可通过 WiX 或 Visual Studio Installer Projects 等工具实现。需注意该方案仅适用于 Windows 平台。因此,若需向多平台分发 CLI 应用程序,这可能并非最佳选择 。
  • .NET 工具 :我们可以将应用程序作为库或工具打包为 NuGet 包分发。用户可通过 dotnet tool install 命令安装。由于我们的 CLI 应用基于跨平台.NET 版本构建,可将其作为.NET 工具分发至不同平台。该方案的局限在于安装机制:需要.NET CLI 环境。对于开发者或 IT 专业人员群体非常适用,但其他场景则不够理想。只有当 CLI 应用面向开发者或 IT 管理员时(如我们的书签管理应用就不符合)才应考虑此方案。
  • Docker 容器 :这也是实现多平台分发的绝佳选择。Docker 容器的一个显著优势是对本地机器的占用较小,因为它不需要本地安装,且对系统访问权限要求有限。Docker 容器是一个自包含的文件。然而,与.NET 工具选项类似,此选项主要面向开发者或 IT 管理员,因为用户需要具备使用 Docker 的知识才能部署我们的应用程序 。
  • 平台特定打包 :所有主流平台都提供了包管理系统。Linux 以其 apt-get 包管理器闻名,macOS 提供 Homebrew,Windows 则提供 WinGet。这些选项非常理想,因为无论用户技术水平如何,各平台用户都对它们非常熟悉。这意味着这些分发机制不仅面向开发者和 IT 管理员,而是面向所有人!再次强调,由于我们的 CLI 应用程序采用跨平台技术(.NET)构建,我们可以使用相同的代码,并针对这些平台分别打包分发。

如您所见,我们提供了多种打包和分发方案,您可以根据实际情况选择最适合的方式。本章将探讨最后三种打包分发方案:.NET 工具、Docker 容器以及 WinGet(作为特定平台的打包方案 )。

让我们开始吧!

CLI 应用程序的打包与分发

本节将详细讲解使用三种不同方案打包分发 Bookmarkr 应用程序的要点,并借此说明每种方案最适合的应用场景 。

方案一 —— 作为.NET 工具

通过将我们的应用程序打包并作为.NET 工具分发,用户将能够使用.NET CLI 进行安装。但需要注意的是,用户必须确保安装了适当版本的.NET,以避免版本不匹配导致应用程序出现意外行为。

步骤1 - 打包

第一步是修改 .csproj 文件,添加表明应将其打包为工具的属性。这些属性应添加到 <PropertyGroup> 部分:

<PackageId>bookmarkr</PackageId>
<Version>1.0.0</Version>
<Authors>Tidjani Belmansour</Authors>
<Description>Bookmarkr is a bookmarks manager provided as a CLI application.</Description>
<PackAsTool>true</PackAsTool>
<ToolCommandName>bookmarkr</ToolCommandName>
<PackageOutputPath>./nupkg</PackageOutputPath>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageReadmeFile>README.md</PackageReadmeFile>
<Copyright>Tidjani Belmansour. All rights reserved.</Copyright>
<PackageProjectUrl>https://github.com/PacktPublishing/Building-CLI-Applications-with-C#-and-.NET</PackageProjectUrl>
<RepositoryUrl>https://github.com/PacktPublishing/Building-CLI-Applications-with-C#-and-.NET</RepositoryUrl>
<PackageTags>.net cli;bookmark manager;.net 8</PackageTags>

让我们解释一下刚才添加的内容:

  • PackageId:这是我们包的唯一标识符。
  • Version:表示我们包的版本号。当需要打包新版本时,需要修改此值。
  • Authors:表示包的作者(或作者列表)。
  • Description:提供关于应用程序功能的简要描述。
  • PackAsTool:设置为 true 时,表示应将应用程序打包为.NET 工具 。
  • ToolCommandName:这是用户将在终端中输入以执行我们应用程序的命令名称。
  • PackageOutputPath:由于.NET 工具被打包为 NuGet 包,随后会生成一个 .nupkg 文件。此属性指定该文件的生成位置 。
  • PackageLicenseExpression:我选择将代码以 MIT 许可证提供,因为这是一个宽松的许可证,只要在所有副本或软件的实质性部分中包含原始版权声明和许可证,就允许在任何项目中重用代码 。
  • PackageReadmeFile:这指向一个 Markdown 文件,其中我们解释了应用程序的用途、如何开始使用它以及指向其文档的链接等内容。该 Markdown 文件的内容将显示在 NuGet 网站上的包页面,供用户阅读。您可以在代码仓库中找到该文件。
  • Copyright:这展示了应用程序的版权详细信息。
  • PackageProjectUrl:这指向项目网站的主页。
  • RepositoryUrl:这指向存放应用程序代码的仓库 。
  • PackageTags:这是一个用分号分隔的关键词列表,可用于搜索包时使用。

要指定 README.md 文件的位置和处理方式,我们需要在 .csproj 文件中添加以下 XML 代码:

<ItemGroup>
    <None Include="README.md" Pack="true" PackagePath="\"/>
</ItemGroup>

第二步是将应用程序打包。通过运行以下命令实现:

dotnet pack --configuration Release

请注意,它将在 PackageOutputPath 属性指定的位置生成。

我们的软件包现已准备就绪可供分发。

步骤二 - 分发

分发.NET 工具最常见的方式是通过 NuGet 网站提供,该网站位于 NuGet Gallery | Home.

现在让我们访问 NuGet 网站,点击页面右上角的登录链接 :

 

图 11.3 – 授予 NuGet 站点所需权限

由于这是我首次使用此账号登录,NuGet 网站要求我提供用户名:

 

图 11.4 – 为 NuGet 站点选择用户名

就这样!作为 NuGet 包的发布者,我现在一切准备就绪,可以开始上传我的包了:

 

图 11.5 – 已设置为 NuGet 包发布者

现在我们来上传我们的包!

我们只需点击上传并浏览到之前生成的 .nupkg 文件。系统会对包进行分析,验证结果将显示如下:

 

图 11.6 – 将包上传至 NuGet 网站

由于我们的包是有效的,我们可以点击页面底部的提交按钮来提交它。

上传后,通常需要约 15 分钟(但有时可能长达 1 小时)来验证和索引该软件包,之后才会出现在搜索结果中:

 

图11.7 – 等待验证与索引的软件包

当包验证和索引完成后,它将像其他 NuGet 包一样出现在 NuGet 网站上

 

图 11.8 – Bookmarkr 已在 NuGet 网站上架!

既然用户已经能够找到我们的应用程序,接下来让我们看看如何部署它。

第三步 - 部署

用户只需输入以下命令: 即可非常轻松地在自己的机器上部署(即安装)我们的应用程序。

dotnet tool install --global bookrmarkr

安装完成后,用户可通过输入此命令: 来执行我们的应用程序

bookrmarkr

就这样!我们已经将 Bookmarkr 打包、分发并部署为.NET 工具。

现在让我们看看如何将 Bookmarkr 作为 Docker 容器交付给用户。

选项二——作为 Docker 容器

将我们的应用程序打包并分发为 Docker 容器,可以让用户通过减少应用程序在其环境(即操作系统和数据 )上的占用空间来安装和使用我们的应用。

第一步 - 包装

如果你熟悉容器技术,可能已经知道创建容器镜像需要一个 Dockerfile。

Dockerfile 是一个无扩展名的文件,应位于项目目录的根目录下。对我们的应用程序而言,其内容如下:

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /app
COPY *.csproj ./
RUN dotnet restore
COPY . ./
RUN dotnet publish -c Release -o out
FROM mcr.microsoft.com/dotnet/runtime:8.0
WORKDIR /app
COPY --from=build /app/out .
ENTRYPOINT [«dotnet», «bookmarkr.dll»]

本质上,这个文件指示 Docker 构建并发布应用程序(前六行),然后基于已发布的应用程序构建容器镜像(剩余五行)。

在运行实际构建镜像的命令之前,我们需要确保 Docker Desktop 和 Windows Subsystem for LinuxWSL)都已安装并运行。请注意,Docker Desktop 需要本地计算机上的管理员权限。

Docker Desktop 可通过以下命令安装:

winget install Docker.DockerDesktop

WSL 可通过以下命令安装(安装 WSL 后需要重启 Windows):

wsl --install

构建 Docker 镜像的命令如下:

docker build -t bookmarkr .

-t bookmarkr 参数用于为要生成的 Docker 镜像打上名称标签及可选版本号(更多细节稍后说明)。

最后一个点字符既不是打字错误也不是可选的。它指的是我们所说的构建上下文 。更具体地说,它指示 Docker 在哪里查找 Dockerfile,在本例中就是当前目录 。

该操作大约需要五分钟,完成后将创建 Docker 镜像,可以通过输入以下命令来获取它。

docker images

请注意,该容器镜像已在我们的本地机器上生成。不过,我们应将其分发到所有人都能轻松找到的位置 。

第二步 – 分发

分发 Docker 镜像最常见的方式是通过 Docker Hub。

为此,我们需要访问 Docker Hub 门户网站,地址是 https://hub.docker.com。如果您还没有 Docker Hub 账户,可以在此处创建。我已拥有账户,用户名是 theAzurian。.

接下来,让我们按照步骤将本地 Docker 镜像推送至 Docker Hub。

首先,让我们使用以下命令: 登录到我们的 Docker Hub 账户

docker login -u theazurian -p ****

I’m passing my Personal Access Token (PAT) to the -p parameter. This PAT was created through the Docker Hub portal.

接下来,我们需要为镜像打标签,包含其作者的 Docker Hub 用户名、应用程序名称及其版本, 如下所示:

docker tag bookmarkr theazurian/bookmarkr:1.0.0

最后,我们需要使用以下命令将打好标签的镜像推送到 Docker Hub:

docker push theazurian/bookmarkr:1.0.0

我们可以通过访问门户网站并在 Docker Hub 个人资料中查找来确认镜像已成功推送至 Docker Hub:

 

图 11.9 – Bookmarkr 已在 Docker Hub 门户中可用!

我们也可以在 Docker Hub 门户中搜索它:

 

图 11.10 – 在 Docker Hub 门户中搜索 Bookmarkr

我们的应用现在可以被用户找到了。让我们看看它如何部署上线 。

第三步 - 部署

为了让用户在 Windows 机器上运行 Docker,他们还需要同时安装 Docker Desktop 和 WSL。

Docker Desktop 可通过以下命令安装:

winget install Docker.DockerDesktop

WSL 可通过以下命令安装(安装 WSL 后需要重启 Windows):

wsl --install

现在,用户可以通过在 Docker Hub 上输入以下命令来获取应用程序:

docker pull theazurian/bookmarkr:1.0.0

他们可以通过输入以下命令来执行它:

docker run theazurian/bookmarkr:1.0.0

随后 Bookmarkr 可以作为 Docker 容器在用户电脑上运行。

 

图 11.11 – 以 Docker 容器形式运行的 Bookmarkr

就这样!我们将 Bookmarkr 打包、分发并部署为一个 Docker 容器 。

现在让我们看看如何将 Bookmarkr 作为 WinGet 包交付给用户。

选项 3——作为 WinGet 包

通过将我们的应用程序打包并分发为 WinGet 包,用户可以使用微软的包管理器 WinGet 来安装它,就像安装其他应用程序一样。

打包

要将.NET CLI 应用程序打包以通过 WinGet(官方 Windows 包管理器)分发,我们首先需要创建一个清单文件 。

虽然可以手动创建清单并提交至 GitHub 上的 WinGet 包仓库(https://github.com/microsoft/winget-pkgs),但最简单的方式是使用 WingetCreate 命令行工具 。

首先使用以下命令进行安装:

winget install wingetcreate

在创建新清单前,我们需要先使用以下命令将 CLI 应用程序构建为自包含的.NET 应用:

dotnet publish -c Release -r win-x64 -p:selfcontained=true -p:IncludeNativeLibrariesForSelfExtract=true -p:PublishSingleFile=true

让我们仔细看看这个命令 :

  • -c Release:由于这是应用程序的生产就绪版本,我们希望通过 Release 配置发布,以确保其针对性能进行了优化。
  • -r win-x64:由于 WinGet 是 Windows(且仅限 Windows)的包管理器,我们指定目标运行时为 64 位版本的 Windows。
  • -p:selfcontained=true:自包含应用程序已包含.NET 运行时,因此用户机器无需安装。该应用程序将携带运行所需的一切,包括运行时、库和依赖项。
  • -p:IncludeNativeLibrariesForSelfExtract=true:这确保平台特定库以及非托管原生库包含在发布的应用程序中。这对于使用某些特定 Serilog 接收器和 SQLite 库非常有用。
  • -p:PublishSingleFile=true:该参数指示.NET 将所有内容(包括应用程序代码、.NET 运行时及依赖项)打包成单个可执行文件。虽然这使得分发更加便利(因为我们只需分发单个文件),但生成的文件体积会比框架依赖发布方式更大。

应用程序将生成在 bin\Release\net8.0\win-x64\publish 目录下 。

接下来,我们将其上传至 WinGet 工具应能访问的位置。通常选择远程、公开可读的存储位置,我决定使用 Azure 存储账户。因此,可执行文件的存放位置将是 https://bookmarkr.blob.core.windows.net/releases/1.0.0/.

关于 GITHUB 发布版

如果你的应用程序是作为 GitHub 上的开源项目构建的,你很可能会将可执行版本作为发布版本提供。然而,GitHub 上的发布遵循某些远超出本书范围的指南。如果你对这个主题感兴趣,我建议你通过访问 https://github.com/github/docs/blob/main/content/repositories/releasing-projects-on-github/about-releases.md 来探索这些指南。.

现在我们来创建清单文件!可以使用这个命令:

wingetcreate new https://bookmarkr.blob.core.windows.net/releases/1.0.0/bookmarkr.exe

该工具将询问一系列生成清单文件所需的问题。以下是它的示例:

 

图 11.12 – 生成 WinGet 清单文件

将生成三个文件:

  • 版本清单 (theAzurian.bookmarkr.yaml):包含有关正在打包的应用程序特定版本的元数据。
  • 安装程序清单 (theAzurian.bookmarkr.installer.yaml):详细说明应用程序的安装细节。
  • 默认区域设置清单 (theAzurian.bookmarkr.locale.en-CA.yaml):定义应用程序的本地化设置。它确保用户获得经过适当本地化的应用程序版本,通过以用户首选语言呈现信息来提升用户体验。

我个人喜欢将这些文件保存在我的 Visual Studio 项目中,放在我在项目根目录下创建的以下文件夹结构中:

>/manifests/ApplicationName/Version

因此,在我们的案例中,这个文件夹结构将如下所示:

/manifests/Bookmarkr/1.0.0

在将清单文件提交给 WinGet 团队之前,建议先在本地进行测试以确保其按预期工作。这很重要,因为如果清单存在问题 ,提交包可能会导致 WinGet 审核流程延迟。

为此,我们首先需要启用从本地清单安装应用程序的功能。这可以通过在管理员身份运行的终端中执行以下命令来完成:

winget settings --enable LocalManifestFiles

接着,我们运行此命令并提供 manifests.json 文件的路径:

<strong><span style="color:#222222">winget install --manifest "C:\code\Chap11\bookmarkr\manifests\Bookmarkr\1.0.0\"</span></strong>

可以看到,应用程序已安装并按预期运行:

 

图 11.13 - 提交前在本地测试 WinGet 包

我们已准备好将清单提交给 WinGet 团队!

向 WinGet 包存储库提交清单需要我们为 GitHub 账户生成个人访问令牌(PAT)。我们可以使用 wingetcreate token 命令完成此操作,或者跳过此步骤,在提交清单时 wingetcreate 会提示我们验证 GitHub 账户。让我们采用这种方式!

让我们运行以下命令:

wingetcreate submit "C:\code\Chap11\bookmarkr\manifests\Bookmarkr\1.0.0\"

这将打开浏览器并跳转至 GitHub 登录页面。我们需要登录账户,完成后还需提供所需的授权:

 

图 11.14 - 为我们的 GitHub 账户授权 WingetCreate

随后将跳转至拉取请求页面,我们可在此跟踪进度。约 30 分钟后,拉取请求完成,用户即可安装该软件包。

用户随后可通过 WinGet 输入以下命令安装 Bookmarkr:

winget install --id theAzurian.Bookmarkr

大功告成!我们已成功将 Bookmarkr 打包、分发并部署为 WinGet 软件包 。

至此,我们已经了解了三种不同的应用程序打包、分发和部署方法。但如何管理该应用的多个版本呢?这正是我们将在下一节探讨的内容。

应用程序的版本管理

我们之前介绍的所有方案都提供了版本管理机制。版本管理与所选的打包分发机制同等重要。

随着应用程序不断演进,新增、修改或移除功能时,我们需要为用户提供按需获取更新的途径。这正是版本控制发挥作用的地方。

目前我们仅分发单一版本的应用程序。因此,安装时既可以省略版本号,也可以明确指定版本 。

但如果我们需要更新应用程序呢?如何分发新版本?如果新版本引入了错误,我们需要回滚到上一个版本该怎么办?

让我们针对之前提到的每种分发方法探讨如何实现这一点。

语义化版本控制入门

在深入探讨如何管理应用程序的不同版本之前,让我们先介绍一下语义化版本控制的概念。.

如果你熟悉这种应用程序版本控制方法,就会知道它可能是行业中最常见且广泛采用的方式。如果之前未曾听闻,让我简要介绍一下。若想更深入探索语义化版本控制,建议访问其官方网站 :Semantic Versioning 2.0.0 | Semantic Versioning.

本质上,语义化版本控制使用以下格式表达版本号:

Major.Minor.Patch

此处包含以下要素 :

  • 主版本号 :表示该应用版本包含与先前主版本不兼容的重大变更
  • 次要版本 :表示该应用程序版本仅新增了与同一主版本先前版本向后兼容的新功能
  • 补丁版本 :表示该应用程序版本包含与同一主版本先前版本向后兼容的错误修复

每个部分都用一个数字表示,该数字会随着每个新版本递增。

既然我们已经理解了语义化版本控制,现在就用它来管理我们的应用程序的不同版本。

管理.NET 工具的版本

如果您运行了我们提供的 Bookmarkr 作为.NET 工具的版本,您肯定已经注意到它会返回以下错误信息:

 

图 11.15 – 作为.NET 工具的 Bookmarkr 未能执行

那么让我们来解决这个问题并发布一个新版本。

这个错误是由于执行 dotnet pack 命令时,appsettings.json 文件没有被包含在包中导致的。

幸运的是,解决这个问题很简单。在 .csproj 文件中找到以下条目:

<None Update="appsettings.json">

将其替换为以下内容:

<None Update="appsettings.json" Pack="true" PackagePath="\">

由于我们即将打包分发的新版本仅提供了错误修复,因此我们将递增补丁号,使版本号如下所示:

<Version>1.0.3</Version>

现在,我们可以按照之前描述的相同步骤来打包和分发新版本。

不过,在分发之前,建议使用以下命令在本地进行测试:

dotnet tool install --global bookmarkr --version 1.0.3 --add-source "C:\code\Chap11\bookmarkr\nupkg"

--add-source 参数允许我们指定软件包的部署来源位置。这里,我指定的是 NuGet 包在我本地机器上生成的路径。

在确保新版本在本地机器上成功运行后,我们就可以将其推送到 NuGet 网站 。

用户可以通过提供版本号作为参数来获取工具的特定版本。在本例中,可以通过输入以下命令实现:

dotnet tool install --global bookmarkr --version 1.0.3

或者,他们只需输入以下命令即可获取最新版本:

dotnet tool install --global bookmarkr

执行此命令后,工具的旧版本将被新版本取代。

通过运行应用程序的新版本,我们现在可以看到错误已解决:

 

图 11.16 – Bookmarkr 作为.NET 工具成功运行

就这样!我们现在已经学会了如何管理.NET 工具的版本。

让我们来看看如何管理 Docker 容器的版本。

管理 Docker 容器的版本

你可能已经注意到,当我们把 Docker 镜像推送到 Docker Hub 时,我们用版本号进行了标记。因此,如果我们想分发新版本,可以用不同的版本号来标记新镜像。

不过,如果你熟悉 Docker,可能知道可以不指定容器版本号或使用 latest 标签来操作容器。

在分发多个版本的容器时,通过使用 latest 标签标记该版本,来指明哪个是最新版本非常重要。

那么,假设我们正在分发新版本的 Bookmarkr,并且想表明这个新版本是最新版本。我们可以通过以下方式实现:

docker build -t theazurian/bookmarkr:2.0.0 .
docker tag theazurian/bookmarkr:2.0.0 theazurian/bookmarkr:latest
docker push theazurian/bookmarkr:2.0.0
docker push theazurian/bookmarkr:latest

让我们来解释这些命令:

  • 第一条命令创建了一个标记为版本 2.0.0 的新 Docker 镜像
  • 第二条命令将版本 2.0.0 标记为最新版本
  • 第三条命令将标记为版本 2.0.0 的镜像推送到 Docker Hub
  • 第四条命令将标记为最新版本的镜像推送至 Docker Hub

我们使用两个不同标签推送同一镜像的做法,使得用户可以通过 docker pull 命令选择是否指定版本号来获取镜像。因此,随着我们持续更新应用并推送新的 Docker 镜像,我们会用 latest 标签标记最新版本。若该版本存在缺陷,我们可以通过为旧版本添加 latest 标签来引导用户回退至先前版本。

若前往 Docker Hub 门户,可见新版本已成功推送。请注意同一镜像存在两个版本:一个带有 2.0.0 版本号标签,另一个则带有 latest 标签 。

 

图 11.17 - 新版本的 Docker 镜像已推送至 Docker Hub

在用户端,可以通过明确指定标签来获取特定版本, 如下所示:

docker pull theazurian/bookmarkr:2.0.0

或者,他们也可以通过省略标签来获取最新版本(即标记为 latest 的版本), 如下所示:

docker pull theazurian/bookmarkr

用户随后将看到以下内容:

 

图 11.18 – 运行新版本的 Docker 容器

就这样!我们现在已经学会了如何管理 Docker 镜像的版本。

让我们来看看如何管理 WinGet 包的版本。

管理 WinGet 包的版本

为了提交应用程序的新版本(在应用程序代码或功能更新后),我们首先需要在 .csproj 文件中更新版本号(即 <Version> 元素)。

接下来,我们需要使用之前提到的相同命令再次发布应用程序:

dotnet publish -c Release -r win-x64 -p:selfcontained=true -p:IncludeNativeLibrariesForSelfExtract=true -p:PublishSingleFile=true

然后我们需要将生成的二进制文件上传到分发位置,即我们的 Azure 存储账户,注意应为新版本创建新目录。对于版本 1.0.3,路径将如下所示:

https://bookmarkr.blob.core.windows.net/releases/1.0.3/bookmarkr.exe

下一步是使用此命令: 更新清单

wingetcreate update theAzurian.Bookmarkr --version 1.0.3 https://bookmarkr.blob.core.windows.net/releases/1.0.3/bookmarkr.exe

新清单生成完毕,已准备好提交。

不过正如之前所学,在提交前本地测试新版本始终是良好实践。为此,我们将执行与之前相同的命令:

winget install --manifest "C:\code\Chap11\bookmarkr\manifests\Bookmarkr\1.0.3\"

测试通过后,使用以下命令提交新版本:

wingetcreate submit "C:\code\Chap11\bookmarkr\manifests\Bookmarkr\1.0.3\"

剩余步骤与提交应用程序初始版本时遵循的流程相似。

新版本一经批准并添加到 WinGet 包存储库后,用户即可查找并安装。他们可以使用以下命令安装最新版本:

winget install --id theAzurian.Bookmarkr

或者,他们也可以通过向命令传递所需的版本号参数来安装特定版本, 如下所示:

winget install --id theAzurian.Bookmarkr --version 1.0.3

 

图 11.19 – Bookmarkr 的更新版本已在 WinGet 中提供

就这样!这就是我们管理 WinGet 包多个版本的方法。

摘要

在本章中,我们学习了如何将 Bookmarkr 打包并部署到不同平台,以便分发给全球用户,无论他们选择的是 Windows、Linux 还是 macOS 平台。

从我们最初萌生开发这款 CLI 应用程序的想法,到如今它被全球数百万用户使用,这确实是一个重要的里程碑。让我们花点时间来庆祝这一成就,并为自己感到自豪。 恭喜!🎉

然而,部分用户反馈应用程序偶尔运行缓慢。由于我们使用的是高性能电脑,尚未遇到此类性能问题,但并非所有用户都具备相同硬件条件。虽然我们可以直接规定运行 Bookmarkr 的最低配置要求,但我们不希望因此限制能从中受益的用户数量。因此,我们决定探索是否有改进方案 。

下一章节中,我们将研究多种优化技术来提升应用程序的性能表现。

轮到你了!

配合提供的代码进行实践是通过实操学习的最佳方式。

更有效的方式是通过挑战任务来提升技能。为此,我建议您通过添加以下功能来改进 Bookmarkr 应用。

任务 1 - 支持 Linux 用户通过 apt-get 命令安装 Bookmarkr

目前,Bookmarkr 可以通过 WinGet 部署到 Windows 系统。但这在 Linux 上无法实现,因为 Linux 用户通常使用 apt-get 来部署应用程序。因此,你需要将 Bookmarkr 打包成 apt-get 软件包,以便 Linux 用户也能享受使用它的乐趣 。

任务#2——让 macOS 用户能够通过 Homebrew 安装 Bookmarkr

对于 macOS 用户来说也是如此:他们通常使用 brew 命令来安装应用程序。因此,您需要将 Bookmarkr 作为 Homebrew formula 进行分发。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

akluse

失业老程序员求打赏,求买包子钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值