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

桌面应用程序的 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 创建安装包。

使用 Inno Setup 创建安装包

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

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

立即进入“豆包AI人工智官网入口”;

立即学习“豆包AI人工智能在线问答入口”;

首先我们需要一个 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 "..wpfbinRelease"

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=lowestOutputBaseFilename=mysetup {#MyAppCustomerVersion}Compression=lzmaSolidCompression=yesWizardStyle=modernVersionInfoCompany={#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: ignoreversionSource: "{#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 运行一下这个脚本文件,确保它正确运行(如果成功的话会在 InstallerOutput 目录下生成一个安装程序)。

在 Azure Pipelines 上运行 Inno Setup

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

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

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

trigger:

  • master

pool:vmImage: 'windows-latest'

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

steps:

  • task: NuGetToolInstaller@1

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

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

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

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

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

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

最后

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

Azure Pipelines 文档Inno Setup – a free installer for Windows programsChocolatey Software – The package manager for Windows

以上就是[Azure DevOps] 使用 Inno Setup 制作桌面软件安装包的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/115339.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
菜鸟app寄件时怎么选择快递公司_菜鸟app选择快递公司指南
上一篇 2025年11月24日 15:59:10
Spring Boot 启动时报告错误:友好的用户反馈
下一篇 2025年11月24日 16:00:40

相关推荐

  • 高效利用 PriorityQueue 合并并排序多个列表

    本教程详细阐述了如何使用 Java 的 PriorityQueue 高效地合并并排序多个整数列表。文章首先指出将列表作为元素放入 PriorityQueue 的常见误区,进而纠正为应将单个整数元素放入队列。接着,它演示了如何正确声明、填充 PriorityQueue,并强调了通过循环调用 poll(…

    2026年9月22日
    300
  • mac怎么设置动态壁纸_mac设置动态壁纸方法

    可通过系统设置直接启用macOS自带的动态桌面;2. 利用iCloud同步功能实现Apple设备间的动态壁纸共享;3. 安装第三方应用扩展更多动态效果如视频或实时天气;4. 手动将.heic或.mov格式文件添加至指定目录以设置自定义动态壁纸。 如果您希望为Mac增添个性化视觉体验,可以将动态壁纸设…

    2026年9月22日
    200
  • 如何配置Android开发环境 Android Studio安装与JDK配置方法

    答案:配置Android开发环境需先安装JDK并设置环境变量,再下载安装Android Studio,配置SDK及虚拟设备,最后创建项目测试。具体步骤包括:1. 安装JDK 17并配置JAVA_HOME和Path;2. 从官网下载Android Studio并安装,自动集成SDK;3. 通过SDK …

    2026年9月22日
    100
  • ClipStudioPaintPro如何导出AI漫画图片?保存图像的详细指南

    导出AI漫画图片需通过Clip Studio Paint Pro的“文件”菜单选择“导出”,根据用途选单页、多页或Webtoon导出,推荐PNG用于高质量或透明背景需求,JPG用于网络分享以平衡文件大小与画质,设置300dpi以上分辨率确保清晰度,色彩配置选用sRGB保障跨平台一致性,批量导出时利用…

    2026年9月22日
    100
  • 拼多多商家版怎么赚钱?拼多多商家版怎么赚钱提现

    答案:通过拼多多商家版开设虚拟资料店铺,缴纳500元保证金注册个人店,选品如PPT模板、教程等高需求低风险商品,利用阿奇索等工具设置自动发货,结合低价引流和付费推广提升销量,订单完成后资金在T+1或T+7结算周期后提现至银行卡。 如果您想通过拼多多商家版实现盈利并完成资金提现,需要了解其核心的运营模…

    2026年9月22日
    400
  • Laravel 8 注册成功但登录失败的解决方案

    本文针对 Laravel 8 中使用 php artisan ui:auth 生成的认证系统,注册功能正常但登录功能失效的问题,提供了一种解决方案。通过重写 LoginController 中的 username() 方法,将认证字段从默认的 email 修改为 username,从而解决登录失败的…

    2026年9月22日
    000
  • 如何在GravitDesigner中使用AI裁剪图片?快速掌握裁剪技巧

    如何在GravitDesigner中使用AI裁剪图片?快速掌握裁剪技巧如何在GravitDesigner中使用AI裁剪图片?快速掌握裁剪技巧如何在GravitDesigner中使用AI裁剪图片?快速掌握裁剪技巧如何在GravitDesigner中使用AI裁剪图片?快速掌握裁剪技巧

    Gravit Designer没有内置AI智能抠图功能,但通过形状裁剪(剪切蒙版)、路径编辑和布尔运算等工具组合,可实现高精度、非破坏性的精细化裁剪。其“智能”体现在非破坏性编辑、矢量级精度和工具协同的灵活性,虽需手动操作,却能完全掌控裁剪过程,适合追求专业输出的设计师。 ☞☞☞AI 智能聊天, 问…

    2026年9月22日 用户投稿
    100
  • 虎卫战神AI巡航玩法指南

    虎卫战神AI巡航玩法指南虎卫战神AI巡航玩法指南虎卫战神AI巡航玩法指南虎卫战神AI巡航玩法指南

    在《虎卫战神》中,战力的提升始终是每位玩家的核心目标。无论是装备强化、任务奖励、主公升阶,还是转生炼体,各类成长系统都离不开关键材料的支持。而这些材料大多需通过挑战BOSS获取,主线任务推进同样依赖击败指定数量的BOSS。 频繁切换地图、升级效率低下是否让你倍感疲惫?别担心!2025年必备的AI巡航…

    2026年9月22日 用户投稿
    000
  • rm -rf 误删文件?别急,或许有救!

    rm -rf 误删文件?别急,或许有救!rm -rf 误删文件?别急,或许有救!rm -rf 误删文件?别急,或许有救!rm -rf 误删文件?别急,或许有救!

    立即采取行动! 在生产环境中,我们应尽量避免进行风险操作。但如果不慎犯错,如何挽救呢?让我分享一个故事:上周我为了打包一个应用,需要整理Ubuntu 16.04上的线上数据,不小心删除了一个数据文件,幸而最终有惊无险,现记录如下。 extundelete 我的恢复计划主要依赖于一个工具——extun…

    2026年9月22日 用户投稿
    000
  • MySQL跨数据库查询技巧_实现不同数据库间的数据联动操作

    MySQL跨数据库查询技巧_实现不同数据库间的数据联动操作MySQL跨数据库查询技巧_实现不同数据库间的数据联动操作MySQL跨数据库查询技巧_实现不同数据库间的数据联动操作MySQL跨数据库查询技巧_实现不同数据库间的数据联动操作

    mysql跨数据库查询的核心方法是在sql语句中通过“数据库名.表名”方式指定不同数据库的表,实现数据联动。1.在同一个mysql实例内,直接使用数据库名加表名进行关联查询,如db_user.users和db_order.orders,前提是用户需具备相应权限且建议对关联字段建立索引以提升性能;2.…

    2026年9月22日 用户投稿
    400
  • Procreate的AI混合工具怎么用?提升数字绘画效率的实用教程

    Procreate虽无直接名为“AI混合工具”的功能,但其图层混合模式、涂抹工具、Alpha锁定与剪裁蒙版等设计,共同构成了智能化的色彩混合体系。通过正片叠底、滤色等模式可实现自然光影叠加,涂抹工具结合纹理笔刷能模拟真实颜料融合,Alpha锁定和剪裁蒙版则确保混合精准可控。分层渐变、低不透明度叠加及…

    2026年9月22日
    700
  • windows怎么设置自动清理回收站_windows自动清理回收站的设置步骤

    可通过存储感知、组策略或任务计划程序设置回收站自动清理。首先启用存储感知并配置回收站文件保留时间;其次专业版用户可使用组策略编辑器精细管理回收站容量与清理周期;最后通过任务计划程序创建定时任务,运行PowerShell命令“Clear-RecycleBin -Force”实现自动化清理。 如果您发现…

    2026年9月22日
    000
  • VSCode高效配置Node.js:npm集成、中文报错、断点调试

    答案:高效配置VSCode与Node.js需确保Node.js和npm为最新版,利用集成终端运行命令,通过jsconfig.json或tsconfig.json优化项目配置,解决中文乱码需设置终端编码为UTF-8并选择支持中文的字体,调试核心是正确配置launch.json文件,使用pwa-node…

    2026年9月22日
    400
  • MySQL复杂查询语句写作技巧_Sublime环境中编写多表关联逻辑

    MySQL复杂查询语句写作技巧_Sublime环境中编写多表关联逻辑MySQL复杂查询语句写作技巧_Sublime环境中编写多表关联逻辑MySQL复杂查询语句写作技巧_Sublime环境中编写多表关联逻辑MySQL复杂查询语句写作技巧_Sublime环境中编写多表关联逻辑

    提升mysql多表查询性能与可读性的方法包括:1. 优化索引,确保join和where字段有合适索引,理解复合索引左前缀原则;2. 使用cte分解逻辑,使结构清晰易维护;3. 利用sublime text插件如sqltools、sublimelinter提升编写效率;4. 拆解复杂逻辑,逐步构建查询…

    2026年9月22日 用户投稿
    100
  • windows8桌面图标有蓝色阴影怎么去掉_windows8取消桌面图标蓝色底纹的方法

    1、调整视觉效果设置,取消“在桌面上为图标标签使用阴影”可消除蓝色背景;2、解除桌面Web项目锁定并清除Web内容;3、专业版用户可通过组策略禁用Active Desktop功能以彻底解决问题。 如果您发现Windows 8系统中的桌面图标带有蓝色阴影或底纹,这通常是由于系统视觉效果设置或桌面项目锁…

    2026年9月22日
    100
  • 如何在MXNet中训练AI大模型?高效构建深度学习的详细步骤

    如何在MXNet中训练AI大模型?高效构建深度学习的详细步骤如何在MXNet中训练AI大模型?高效构建深度学习的详细步骤如何在MXNet中训练AI大模型?高效构建深度学习的详细步骤如何在MXNet中训练AI大模型?高效构建深度学习的详细步骤

    答案是优化数据管道、采用分布式训练、应用内存优化技术、精细调参。具体包括:使用RecordIO格式和DataLoader多进程预取提升数据加载效率;通过KVStore选择device或dist_sync/dist_async实现单机或多机分布式训练;利用混合精度训练、梯度累积和模型符号化降低显存占用…

    2026年9月22日 用户投稿
    000
  • itextpdf freemarker渲染

    关于打印pdf操作的需求,经过研究,发现以下两种方法: 在现有的模板上进行编辑,这种方法操作难度较大。而通过FreeMarker生成静态页面,然后转换为HTML,操作更为顺畅。动态生成PDF的方法在网上参考较多,经过对比,我认为使用FreeMarker结合IText生成PDF最为简单。参考链接为ht…

    2026年9月22日
    300
  • Java多线程并发控制:告别线程优先级,拥抱锁机制

    本文深入探讨了在Java多线程环境中如何有效解决并发操作中断问题,特别是当多个线程尝试同时执行非原子性操作(如打印)时。文章指出,单纯依赖线程优先级并不可靠,并详细介绍了使用synchronized关键字配合共享锁对象实现互斥访问的关键技术,确保关键代码块的原子性执行,从而避免数据混乱和逻辑错误。 …

    2026年9月22日
    700
  • 使用空值合并运算符为数组元素设置默认值

    本文将介绍如何使用 PHP 的空值合并运算符 (??) 为数组元素设置默认值,尤其是在处理用户输入时。 通过该运算符,可以在变量值为 null 或不存在时,提供一个备选值,从而简化代码并提高可读性。我们将通过一个实际的 Laravel 邮件发送示例,演示如何在请求参数中缺失主题时,设置默认主题。 空…

    2026年9月22日
    600
  • VSCode精简配置Git:中文提交记录、分支可视化、冲突解决

    首先解决中文乱码需配置Git和VSCode编码为UTF-8,其次通过GitLens或Git Graph实现分支可视化,最后利用VSCode内置的冲突解决工具高效处理合并冲突,全面提升Git使用体验。 在VSCode里用Git,我总觉得能再顺手点。特别是处理中文提交信息、想直观看看分支图,或者面对恼人…

    2026年9月22日
    500

发表回复

登录后才能评论
关注微信