MSI和NuGet包哪个更适合持续交付?

21
让我们讨论以下话题。有一个应用程序,目前正在使用好用的xcopy方法部署。这种方法使得管理依赖关系、文件更新等变得困难。有一个想法是通过一些包来开始应用程序部署,就像在Linux上使用RPM那样,但针对的是Windows操作系统。
所以我有一个问题:在经典的Windows安装程序(msi)或nuget或其他什么东西中,哪个包系统更好?

1
NuGet和Windows Installer有着非常不同的用途。 - Christopher Painter
也许你更多地考虑了Chocolatey。他们将其描述为“有点像apt-get”。Chocolatey使用nuget来完成它的魔力。但是,如果你看一下Chocolatey.org,许多软件包只包含一个PowerShell命令,用于下载和安装.MSI文件(或包含.MSI文件的.EXE文件)。 - frank koch
1
@Christopher Painter 如果您能解释一下NuGet的目的以及它与MSI的区别,那将非常有用。您是否有类似的博客文章?我是NuGet的新手,想要了解为什么他们在已经有MSI机制的情况下还要使用NuGet。 - Samselvaprabu
3
MSI是将软件包部署到Windows平台的工具,而Nuget则是在Visual Studio平台中使用SDK包的工具。 - Christopher Painter
2个回答

54

临时性的: 如何避免在WiX/MSI部署解决方案中常见的设计缺陷?

  • 一个非常混乱和不太理想的临时总结,列出了在MSI文件中发现的常见问题。不是很好。比没有好吗?这些书中没有的东西(太混乱了)。

重要主题: 如何避免意外分发敏感信息到我的MSI中?

需要速度: WiX快速入门简短版


WiX & MSI:

MSI是被广泛接受的企业应用标准。与传统的部署技术相比,它有一些重要的企业优势以及简短明了的版本)。WiX是创建MSI文件的新的开源方式。

其他工具:

Hello World & Hello WiX:

请查看一个完整的例子,了解Wix源文件及其组件在Codeproject上的外观。这是Wix的“Hello World”教程。
请参阅“Hello WiX - step-by-step in Visual Studio”。 - 这需要使用WiXVotive(WiX工具集Visual Studio扩展程序 > - WiX的Visual Studio集成,因此您可以获得Intellisense)。请参阅下载页面。 - 底部标记中的内联注释可能是您启动所需的全部内容。 - WiX预处理器变量/定义的小样本Hello WiX C# Custom Actions - 如何将C#自定义操作添加到现有的WiX项目中。

视频示例:

更多示例代码:

WiX快速入门:以下是我找到的一些最佳示例代码链接:

最后:

Debugging:始终检查所有事件日志,应用程序日志和MSI日志-如果有的话。只是提一下。在执行任何其他操作之前,请使用任何可用的调试工具并谷歌精确的错误消息。
检查是否明显缺少运行时库。例如:.Net.Net CoreJavaSilverlightDirect XVC++ RuntimeMS-XML(遗留),等等......

自定义操作调试

MSI 日志记录

事件查看器

  • 按住 Windows 键,点击 R,输入 eventvwr.msc 并按下 Enter
  • 转到 Windows 日志 => 应用程序。查找 MsiInstaller 事件
  • 也要检查其他日志 (安全性系统配置)。

一般调试

调试工具

错误代码:查找错误代码和异常消息。


部署提示: 一个通用的提示来思考部署问题: 什么是锁定 (正在使用, 恶意软件), 什么是阻塞 (权限, 反病毒, 安全工具), 什么是损坏的 (磁盘, 恶意软件, 配置, 加密) 什么是意外的系统状态 (磁盘空间, 时间和日期设置, 语言, 许可证, Windows补丁状态, 路径过长, PendingFileRenames等), 什么是不兼容的产品 (无法共存的东西), 什么是无法访问或配置错误的 (指向错误位置和资源的内容: 网络服务器名称, 磁盘路径, URL, 数据库, 服务, UAT环境, PROD环境等...) 最后但并非最不重要的: 缺少什么 (运行时, 资源图像, 设置文件等)?

注意:始终首先(下面的步骤8):谷歌精确错误消息

启动失败调试1) 重新启动2) 禁用防病毒软件3) 以管理员身份运行并检查,4) 检查依赖项和运行时JavaVC++ Runtime.NET等)。然后,如果需要:5) 详细日志6) 事件日志7) 如果仍然无法工作,则尝试在虚拟机上运行?(许多虚拟机缺少必要的运行时-请检查)或次要计算机?还可以8) 谷歌精确错误消息并检查用户评论,9) 运行问题应用程序的更新? (新安装程序可能会消除错误情况)。10) 还要进行 恶意软件 的全面检查吗? 它现在到处都是。 11) 一些软件(通常是服务器软件)可能需要解决配置设置(错误配置)。桌面应用程序可能需要许可证才能启动。


"锁?": 通过权限和锁定,您可以尝试以提升的权限运行工具吗?您可能会遇到磁盘损坏-磁盘错误?ACL权限有问题(可能存在)。您的杀毒软件已锁定某些MSI正在尝试放回原位的文件。您可以尝试暂时禁用它以查看。请注意,该文件也可能已被隔离(移动到其他位置)。"

通用技巧? - 消费者问题,安装setup.exe失败

针对无法正确安装的设置,以下是一些通用技巧 - 除了检查事件日志和安装和应用程序日志以及搜索任何错误消息(始终要做到这一点 - 也许首先这样做 - 但也许只需重新启动电脑 - 在面对所有复杂性之前)。请注意保留HTML标签。
  1. 重新启动:在安装失败后首先尝试重新启动,看是否可以解决锁定和待处理的重命名。
  2. 其他计算机:尝试在另一台实体计算机上安装?
    • 这是安装媒体的重要烟雾测试!
  3. 虚拟机:尝试在虚拟机上安装?
    • 通常过时,请检查运行时,检查Windows更新。
  4. 运行时:确保各种类型所需的运行时以所需版本存在:
    • 通用VCRedist.NET.NET CoreJavaDirect X,等等...
    • 特定PythonDBMS系统PostgreSQLMSSQL等等...
    • Windows组件IISMSMQ-消息队列Powershell等等...
  5. 次要账户:尝试使用不同的管理员帐户在主机上安装。这可以解决由用户配置文件中的错误引起的问题(这种情况并不罕见)。
  6. 本地安装文件:如果在网络上调用时,将安装文件复制到本地(以消除网络错误源)。
  7. 本地化问题:通常情况下,以其他语言交付的设置可能包含原始安装程序中未见的全新错误。
    • "墨菲领域""我们已经成功地在国际化设置中添加了额外的错误,超出了英文版本"。哦,人性啊!太糟糕了。
    • 尝试下载英文设置版本并进行测试安装?
    • 在英文机器或虚拟机上尝试本地化设置?
    • 还应考虑使用具有不同语言设置的另一个用户帐户运行。

Setup.exe - 再次出现 - 常见的 "阻碍者":

  1. 损坏的安装文件: 安装文件已损坏。重新下载以确保正确性?在浪费一整天之前,作为首要步骤完成?是否正确匹配平台位数和CPU架构?
  2. 恶意软件: 恶意软件可能会导致各种问题。
  3. 安全软件: 反病毒软件防火墙扫描仪等可能会干扰安装。如果需要,请暂时禁用。
  4. 磁盘空间: 确保有足够的磁盘空间!
  5. 代理: 如果有网络要求,是否存在阻止事物的代理服务器?
  6. 策略: 在受管理的网络中可能存在某些策略,会阻止某些功能,从而使安装变得不可能。尝试使用虚拟机?通常限制较少。
  7. 磁盘错误: 扫描磁盘以查看其是否正常。如果不正常,请先修复。对于没有UPS的台式机,现代NVMe硬盘可能会丢失大量数据。
  8. 磁盘安全ACL: 自定义的安全ACL(NTFS访问配置)配置会导致Windows组件和软件运行时出错。除非您知道自己在做什么,否则永远不要使用自定义ACL来管理Windows目录。 错误是确定的

一些链接:


易于访问:

重新打包、应用程序启动调试:

升级:

其他WiX链接:


过程:

  • 打开临时文件夹:按下 Windows键,再按下 R 键,输入%TEMP%,最后按下 Enter
  • ARP:点击 开始,输入 appwiz.cpl,然后按下 Enter 以打开添加/删除程序窗口(或在控制面板中单击“添加/删除程序”)。
  • Win8/10设置GUI:按下 Windows键 + I,选择 应用和功能。选择条目并卸载。
  • 快速启动Powershell:按住 Windows键,再按下 R 键,输入 "powershell",最后按下 Enter
  • 重新启动显卡驱动程序:按下 Windows键 + Ctrl + Shift,再按下 B

以下是需要翻译的内容:

一些学习Wix的好起点链接:

Setup.exe WiX捆绑包或MSI文件本身中提取文件:

正如我在上面提到的建议性的“Wix快速入门”文章中所写:Wix是实践性的只需关注像Codeproject中的简单但完整的真实世界示例 - 仅仅阅读文档可能会让人感到困惑

集中精力将您的应用程序拆分为组件并设置主要升级。作为经验法则,每个组件使用一个文件,并阅读此答案以更好地了解组件创建:如何在wix中更改我的组件GUID? 主要升级是已部署软件的最常用升级机制(另一种常见的升级类型是次要升级)。显然,您可以升级已部署的内容非常重要。在部署第一个软件版本之前使升级方案正常工作,以便您对部署解决方案充满信心。
一旦您设置好组件并且升级解决方案正常工作,剩下的部分就会随着您逐步完成应用程序的部署要求并检查Wix教程网站上的示例而落实: https://www.firegiant.com/wix/tutorial/

如果您直接编写Wix代码(而不使用GUI编辑器),我建议您查看此答案,以了解如何保持源文件简洁:WIX中GUID的语法?

进一步阅读


很棒的清单。你有没有关于自定义操作的示例,它可以接受参数并更新应用程序中的配置文件? - kudlatiger
从未尝试过,但是请在这里查看,并告诉我们它是否适合上面的列表。 - Stein Åsmul

4
我现在正在走这条路,我们继承了使用MSI/WiX进行安装程序的软件,但是考虑将我们的流程转换为持续交付,并推出无需客户端交互的更新。我认为把nuget限定为SDK工具是不正确的,在本质上,它是一种部署版本化文件集的工具。此外,如果您要部署的软件已经严重依赖于nuget,并且您已经将组件打包到nuget包中供内部使用,那么为什么要为了添加额外技术而混合使用呢?在您的msi中打包一个nuget.exe,定期调用其更新,完成。
我知道WiX支持创建补丁,但似乎这是事后想法。另外,如果您的补丁安装失败会发生什么?按顺序安装补丁?您的主要安装程序需要UAC权限,而您的补丁不需要?
我认为时代正在改变,MSI代表了旧的思考方式。Chocolatey是一个很好的例子,但它仍处于这个混合阶段,混合使用了两种技术。
MSI更像是拉 - 您获取一个包,然后安装它。 Nuget更像是推 - 您获取包的名称,安装它,然后定期调用更新,下载并安装新版本。

1
同意,我会避免使用补丁包(.msp)。我多年前编写的一个应用程序使用.msp作为更新机制,它经常会破坏安装。出于好奇,我在我的注册表中查找了使用.msp打补丁的应用程序(在数百个已安装的应用程序中),只找到了一个...就是我的。 - Brandon Bonds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接