0

0

[Azure DevOps] 使用 Inno Setup 制作桌面软件安装包

雪夜

雪夜

发布时间:2025-09-24 08:33:12

|

976人浏览过

|

来源于php中文网

原创

  1. 桌面应用程序的 CI/CD

桌面应用程序的 ci/cd 过程与网站有一些差异,因为桌面应用程序的“部署”只是将安装包分发到目标位置,无需上架到应用商店。根据公司的管理流程,这个过程可以非常复杂,也可以非常简单。在简单的情况下,azure pipelines 中一个 wpf 桌面应用程序的 ci/cd 过程如下:

触发器启动 Pipeline 构建 WPF 应用程序 启动单元测试以确保构建质量 创建安装包 将安装包复制到目标位置 通知用户新安装包已经可以获取

在“使用 Azure Pipelines 实现 CI”这篇文章中,我已经讲解了如何实现第 1、2、3、5 步。至于第 6 步,可以在 Project Settings 的 Notifications 页面中设置使用邮件通知团队成员,也可以参考“使用连接器接收Azure DevOps的通知”这篇文章,通过 Teams 发送构建的结果。

现在我们还缺少第 4 步“创建安装包”,本文将介绍如何在 Azure Pipelines 中使用 Inno Setup 创建安装包。

  1. 使用 Inno Setup 创建安装包

[Azure DevOps] 使用 Inno Setup 制作桌面软件安装包

假设我们已经根据“使用 Azure Pipelines 实现 CI”的方法发布了一个 WPF 应用程序,发布到 Artifacts 的文件如上图所示,可以以 Zip 的形式将所有输出文件下载到本地,基本相当于绿色版软件。但我们不能将这个 Zip 包直接发给客户,我们至少还要包括开始菜单和修改注册表等一大堆东西,因此需要将 Release 的文件打包到一个安装包中。我的公司通常使用 Inno Setup 制作安装包,在 Azure Pipelines 中使用 Inno Setup 也非常简单,因此本文将使用 Inno Setup 作为制作安装包的例子。

首先我们需要一个 iss 脚本。在 install 目录下创建一个简单的名为 SetupScript.iss 的脚本文件,大部分保留了默认值(懒得修改公司名之类的了),它只是将 Release 目录的内容全部打包起来,内容如下:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

define MyAppName "My Program"

define MyAppPublisher "My Company, Inc."

define MyAppURL "https://www.php.cn/link/4c74744a9c10b3001a1d9b87f86eb26f"

define MyAppExeName "wpf.exe"

define VersionSourceAssemblyName MyAppExeName

define BuildOutputFolder "..\wpf\bin\Release\"

define MyAppFileVersion GetFileVersion(AddBackslash(BuildOutputFolder) + VersionSourceAssemblyName)

define MyAppCustomerVersion GetStringFileInfo(AddBackslash(BuildOutputFolder) + VersionSourceAssemblyName, "ProductVersion")

[Setup] ; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications. ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{0B50DAF7-728E-48C7-984F-5E6FDB924490} AppName={#MyAppName} AppVersion={#MyAppCustomerVersion} ;AppVerName={#MyAppName} {#MyAppVersion} AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} DefaultDirName={autopf}{#MyAppName} DisableProgramGroupPage=yes ; Uncomment the following line to run in non administrative install mode (install for current user only.) ;PrivilegesRequired=lowest OutputBaseFilename=mysetup {#MyAppCustomerVersion} Compression=lzma SolidCompression=yes WizardStyle=modern VersionInfoCompany={#MyAppPublisher} VersionInfoVersion={#MyAppFileVersion} VersionInfoProductName={#MyAppName} VersionInfoProductTextVersion={#MyAppCustomerVersion}

[Languages] Name: "english"; MessagesFile: "compiler:Default.isl"

[Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files] Source: "{#BuildOutputFolder}{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion Source: "{#BuildOutputFolder}*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs ; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons] Name: "{autoprograms}{#MyAppName}"; Filename: "{app}{#MyAppExeName}" Name: "{autodesktop}{#MyAppName}"; Filename: "{app}{#MyAppExeName}"; Tasks: desktopicon

[Run] Filename: "{app}{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent

用 Inno Setup 运行一下这个脚本文件,确保它正确运行(如果成功的话会在 Installer\Output 目录下生成一个安装程序)。

PaperAiBye
PaperAiBye

支持近30多种语言降ai降重,并且支持多种语言免费测句子的ai率,支持英文aigc报告等

下载
  1. 在 Azure Pipelines 上运行 Inno Setup

SetupScript.iss 推送到 Azure Repos 上,然后修改对应的 Pipeline。Pipeline 中需要添加两个任务:

  • 一个负责使用 Chocolatey 下载并安装 Inno Setup 的任务
  • 一个调用 Inno Setup 运行 SetupScript.iss 的任务

然后修改 CopyFiles 任务,将 Installer\output 目录中的安装包复制到 $(build.artifactstagingdirectory)。修改后的 YAML 文件如下(其中两个 PowerShell 任务即为新增的两个任务):

trigger:

  • master

pool: vmImage: 'windows-latest'

variables: solution: '*/.sln' buildPlatform: 'Any CPU' buildConfiguration: 'Release'

steps:

  • task: NuGetToolInstaller@1

  • task: PowerShell@2 displayName: 'Inno setup download' inputs: targetType: 'inline' script: 'choco install innosetup'

  • task: NuGetCommand@2 inputs: restoreSolution: '$(solution)'

  • task: VSBuild@1 inputs: solution: '$(solution)' platform: '$(buildPlatform)' configuration: '$(buildConfiguration)'

  • task: PowerShell@2 displayName: 'Execute Inno Setup script' inputs: targetType: 'inline' script: 'iscc.exe Installer\SetupScript.iss'

  • task: CopyFiles@2 inputs: SourceFolder: 'Installer\output' Contents: '*.exe' TargetFolder: '$(build.artifactstagingdirectory)'

  • task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: 'drop' publishLocation: 'Container'

  1. 最后

现在,一个桌面应用程序的 CI/CD 已经基本完成了。当然,实际应用中 iss 脚本和 PowerShell 都可以更复杂,以便完成更多任务,例如程序签名、检查并安装 .Net Framework 等,这些操作都超出了本文的范畴,如有需要可以参考以下链接:

  • Azure Pipelines 文档
  • Inno Setup - a free installer for Windows programs
  • Chocolatey Software - The package manager for Windows

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

389

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

572

2023.08.10

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

578

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1102

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

791

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

452

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2349

2023.08.08

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

777

2023.08.10

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.3万人学习

Excel 教程
Excel 教程

共162课时 | 12.1万人学习

PHP基础入门课程
PHP基础入门课程

共33课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号