MSI 与 nuget 包:哪个更适合持续交付?

Posted

技术标签:

【中文标题】MSI 与 nuget 包:哪个更适合持续交付?【英文标题】:MSI vs nuget packages: which are is better for continuous delivery? 【发布时间】:2014-09-20 04:06:00 【问题描述】:

让我们讨论以下主题。目前正在使用众所周知的 xcopy 方法部署应用程序。这种方法难以管理依赖项、文件更新等。有一些想法可以在一些包的帮助下开始应用程序部署,你知道就像你在 Linux 中的帮助一样RPM,但适用于 Windows。

所以我有一个问题:在 windows 经典 windows 安装程序 (msi) 或 nuget 或其他东西上使用哪种软件包系统更好?

【问题讨论】:

NuGet 和 Windows Installer 有两种截然不同的用途。 也许你想更多的是 Chocolatey。他们将其描述为“有点像 apt-get”。 Chocolatey 使用 nuget 来实现它的魔力。但是,如果您查看 Chocolatey.org,许多软件包只包含一个 Powershell 命令,用于下载和安装 .MSI(或包含 .MSI 的 .EXE) @Christopher Painter 如果您能解释 NuGet 的用途以及它与 MSI 的区别,那将会很有用。你有这样的博尔格词条吗?我是 NuGet 的新手,我想了解他们为什么在 MSI 机制已经存在的情况下使用 NuGet。 MSI 是关于将软件包部署到 Windows 平台。 Nuget 是关于在 Visual Studio 平台中使用 SDK 包的。 【参考方案1】:

临时:How do I avoid common design flaws in my WiX / MSI deployment solution?

MSI 文件中发现的常见问题的非常混乱且不太理想的临时摘要。不是很好。有总比没有好?书上没有的东西(太乱了)。

重要话题:How do I avoid distributing sensitive information in my MSI by accident?

***飞车WiX Quick Start Short Version


WiX 和 MSI

MSI 是公认的企业应用标准。与传统部署相比,它具有 some major corporate benefits (and the short, concise version) 技巧。 WiX 是创建 MSI 文件的新开源方式。

Wix Toolset Download (1) 主要 WiX 设置,2) Votive - Visual Studio 集成设置李> WiX Documentation 安装 WiX 后,在安装文件夹“%ProgramFiles(x86)%\WiX Toolset v3.11\doc”中找到 WiX.chmmsi.chm 帮助文件,以便快速访问文档。 在线:WiX Reference Manual v3Official WiX TutorialGithubBug TrackerMailing ListFireGiant WiX KDB(FireGiant 是 WiX 的商业分支)。 要了解 Wix,您可能需要阅读quick, unofficial summary of the history behind it。 MSBuild - 使用 Visual Studio、Votive 和 MSBuild Harvesting (1):WiX 有自己的工具,用于根据输入文件夹生成 WiX 标记。 该工具名为heat.exe。 WiX 的商业分支FireGiant 有一个名为HeatWave 的工具,具有更多功能。 我在很大程度上未经测试的是工具 WixHeatATLHarvesterExtension:https://github.com/nirbar/WixHeatATLHarvesterExtension(用于从 x64 模块收集注册表信息的 WiX Heat 扩展)

其他工具

然后,您可能想要检查提供安装程序的其他方式,除了 Wix,请阅读: What installation product to use? InstallShield, WiX, Wise, Advanced Installer, etc One more quick-list of tools 主要工具:Advanced Installer,-InstallShield,-PACE Suite

Hello World 和 Hello WiX:

最后在Codeproject 上查看Wix 源文件及其组件外观的完整示例。这是“你好 Wix 的世界”"Hello WiX - step-by-step in Visual Studio"。 这需要 WiXVotive(WiX 工具集 Visual Studio 扩展 > - WiX 的 Visual Studio 集成,因此您可以获得 Intellisense)。 See download page. 底部标记中的内联 cmets 可能是您开始工作所需要的全部内容。 Small sample of WiX preprocessor variables / defines。 Hello WiX C# Custom Actions 如何将 C# 自定义操作添加到现有 WiX 项目。

视频样本

How To Create Windows Installer MSI - .Net Core WiX Create a MSI/Setup package for C# with WiX Toolset

更多示例代码:

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

Helge Klein's real-world WiX sample - 看看这个 (Wayback - Archived Version)。 Rainer Stropek's WiX Samples on Github - 很有帮助。 From MSI to WiX by Alex Schevchuk - 内容陈旧,但非常出色。 Chris Painter's IsWiX Tutorials - 优秀的 WiX 示例。

最后:

Phil Wilson 的 MSI 示例 Github 存储库:https://github.com/Apress/def-guide-to-win-installer。最好的内容,但老化。一般 MSI 示例,而不是 WiX 本身。 我的实验站点:installdude.com。 How-to-create-a-Windows-Service-MSI-Installer-Using-WiX。 WiX 扩展:https://github.com/nirbar/PanelSwWixExtension(Dism.exeetc...

调试:始终检查所有事件日志应用程序日志MSI日志 - 如果有的话。顺便提一下。并且在执行任何其他操作之前使用任何可用的调试工具搜索确切的错误消息

并检查任何明显缺失的运行时。例如:.Net.Net CoreJavaSilverlight Direct XVC++ RuntimeMS-XML(旧版)、etc...

自定义动作调试

Common Causes for Custom Action runtime failures Debugging Custom Actions 对于本机代码/C++,只需将调试器附加到 msiexec.exe Advanced Installer's Debug C# Custom Actions video tutorial

MSI 日志记录

Overview and summary(如何记录、解释日志文件等...) Installsite: MSI log "how-to" More MSI logging information

事件查看器

按住Windows键,点击R,输入eventvwr.msc并按Enter。 转到Windows Logs => Applications。寻找MsiInstaller events。 也检查其他日志(SecuritySystemConfiguration)。

常规调试

"Debugging Light"

Application Launch Problem: Debugging Ideas(鱼雷全散)

ProcMon.exe: 交易工具。一刀切 工具。蜜蜂的膝盖,最高的,量子飞跃,猫的 睡衣。有效地使用它可能是一个挑战,但它是 最好的通用调试工具,免费 (comment link for safekeeping)。

Quick, Rudimentary Sample Hanselman's longer video sample(从大约 3:50 开始)

调试工具

Tools to debug dependency issues - ProcMon.exe, VS, Dependency Walker, etc... COM dependency errors Fuslogvw.exe (Assembly Binding Log Viewer) 必备的服务调试工具: Event ViewerTask ManagerServices.msc Process Explorer, NET command, SC.exe Windows Services Frequently Asked Questions (FAQ)

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

"The Magic Number Database" - 在线查找。 Checking Error Codes - 多种工具和方法。

部署助记符:考虑部署问题的通用助记符:What is locking(正在使用,恶意软件), what is blocking(权限、anti-virus、安全工具)、what is corrupt(磁盘、恶意软件、配置、加密)what are unexpected system states(磁盘空间, 时间和日期设置, 语言, 许可, windows 补丁状态, 路径太长, PendingFileRenames, 等等...), what are incompatible products (不能共存的东西), what is unreachable or misconfigured(指向错误的位置和资源:网络服务器名称、磁盘路径、URL、数据库、服务、UAT 环境、PROD 环境等...)最后但同样重要的是:@ 987654496@(运行时、资源图像、设置文件等...)?


注意:永远在前(下面的第 8 步):Google exact error message

启动调试失败1) Reboot, 2) disable anti-virus3) launch as admin 并检查,4) 检查dependencies and runtimesJavaVC++ 运行时.NET等...)。然后,如果需要:5) verbose log, 6) event logs, 7) Try on a virtual 如果你仍然不能让它工作? (许多虚拟机缺少必要的运行时 - 检查)或 secondary computer? 也有 8) google exact error messages 并检查用户 cmets,9) Run update for the application in question?(新安装程序可以消除错误情况)。 10) 是否也对 malware 进行全面检查?这些天到处都是。 11) 某些软件(通常是服务器软件)可能需要整理配置设置 (misconfiguration)。桌面应用程序可能需要license 才能启动。


锁?:有权限和锁你可以尝试run the tool with elevated rights?您可能有磁盘损坏 - disk errorsFaulty ACL permissions? (可能的)。您的 anti-virus suite 已锁定 MSI 试图恢复原位的某些文件。您可以尝试暂时禁用它来查看。请注意,该文件也可以是 quarantined(移动到其他地方)。


通用技巧? - 消费者问题,failure to install setup.exe:

A generic check-list for deployment issues(以下列表的替代品 - 推荐)。 Visual Studio 问题:A check list for Visual Studio installation problems - 和 an updated version .NET 修复:.Net Framework Repair Tool 卸载失败:MS FixIt: Remove packages that won't uninstall 日志:Microsoft Visual Studio and .NET Framework Log Collection Tool 智能屏幕问题:Digital signatures, false positives, tagged downloaded file

对于无法正确安装的设置。下面的一些通用技巧 - 除了检查 event logsinstallation-application logsgoogling any error messages (也总是这样做 - 也许首先 - 但也许只是先重新启动 - 在面对所有复杂性之前):

    重启:安装失败后首先重启,看看是否能解决锁定和挂起的重命名问题。 其他计算机:尝试安装在另一台物理机器上? 重要的安装介质冒烟测试! 虚拟机:尝试安装在虚拟机上? 经常过时,检查运行时,检查 Windows 更新。 运行时:确保所需版本中存在各种类型的所需运行时: 常见VCRedist.NET.NET CoreJavaDirect Xetc... 具体PythonDBMS systemsPostgreSQLMSSQLetc...Windows 组件IISMSMQ - Message QueuePowershelletc... 辅助帐户:尝试使用不同的管理员帐户在主机上安装。这可以解决由用户配置文件中的错误引起的问题(一点也不罕见)。 本地安装文件:如果安装文件在网络上,则在调用时将其复制到本地(以消除网络错误源)。 本地化问题:以其他语言提供的设置包含原始安装程序(通常是英语)中未发现的全新错误并不少见。 “墨菲场”"We have managed to add additional bugs to the internationalized setups beyond the English version"。哦,人类说!太糟糕了。 尝试下载英文安装版并测试安装? 在英文机器或虚拟机上尝试本地化设置? 还要调查使用具有不同语言设置的另一个用户帐户运行。

Setup.exe - 再次 - 常见的“拦截器”:

    安装文件损坏:安装文件损坏。重新下载确定?在浪费一整天之前将其作为第一步完成?正确的平台位数?正确的 CPU 架构? 恶意软件:就问题而言,恶意软件几乎可以造成“任何事情”。 安全软件Anti-virusfirewallsscannersetc... 可能会干扰安装。如果可能,请在需要时暂时禁用。 磁盘空间:确保有足够的磁盘空间! Ways to clear out disk space。 Long version. 先运行cleanmgr.exe代理:如果有网络需求,是否有代理服务器阻止事物? 政策:可能存在对托管网络有效的政策来阻止某些功能,从而导致无法安装。试试虚拟机?通常限制较少。 磁盘错误:扫描磁盘以查看是否正常。如果没有,请先修复它。对于没有 UPS 的台式机,现代 NVMe 磁盘可能会因断电而丢失大量数据。 磁盘安全 ACL:自定义安全 ACL(NTFS 访问配置)配置会导致 Windows 组件和类似软件出现运行时错误。除非您知道自己在做什么,否则切勿对 Windows 目录使用自定义 ACL。 错误是肯定的

一些链接

The setup process in windows fails access denied when trying to create "uc.micro" folder SQL Server 2017 installation is stuck Visual Studio installer fails on AspNetDiagnosticPack.msi The installer has encountered an unexpected error installing this package - .Error code 2896

轻松访问

XML 文件:Installing XML files False Positives Installer Class Methods - More Installer Class Methods Would this method of installing COM+ work? Windows Installer Best Practice Reboot Manager and Logging Change my component GUID in wix? Simplify WiX markup - 你可以从你的 Wix xml 文件中省略很多源属性 Running Legacy Applications(virtualscompatibility moderepackagingetc...)李> What are ICE Rules Preprocessor versus Localization Variables, and the issue of include files WiX Preprocessor

重新打包,应用启动调试

Procmon.exe, capture, repackaging, service installation and installer methods Section on repackaging here How to run an installation in /silent mode with adjusted settings More on distribution of software Wix - How to run/install application without UI(嵌入 setup.exe、静默运行 setup.exe、应用程序重新打包、引导程序/链接器)

升级

Causes of major upgrade failures Some minor upgrade technical restrictions

其他一些 WiX 链接

WiX 3 dependency on .NET 3.5 Simplify your WiX markup。 Registering COM EXEs with WiX。 Can't uninstall, it fails。 Dynamic Link Libraries。 Microsoft Debugging Environments。 How do I create a Prerequisite Package for Windows Installer? How do I embed CustomAction.CA.dll in to MSI? Installed program is removed automatically everytime when server restarts from windows server 2012 R2

程序

打开临时文件夹Windows 键 => 点击R => 输入:%TEMP% => 按:EnterARP:去 开始 运行 appwiz.cpl ENTER 以打开添加/删除程序小程序(或单击控制面板中的添加/删除程序)。李> 设置 GUI Win8/10Windows 键 + 点击 I => Apps & Features。选择条目并卸载。 Powershell 快速启动:按住Windows 键,点击R,输入“powershell”并按输入重新启动图形驱动程序Windows 键 + Ctrl + Shift 并点击 B.

一些很好的学习 Wix 的起始链接:

My Wix quick start suggestions Good resources for learning how to create MSI installers from WiX How to implement WiX installer upgrade?(重大升级) What are limitations of WiX and WiX Toolset?

Setup.exe WiX Bundle 或从 MSI 文件本身中提取文件:

Extract MSI from EXE - 包括如何提取嵌入在 WiX Burn 包可执行文件中的文件。 How can I compare the content of two (or more) MSI files? - 包括如何使用 WiX 的 dark.exe 工具从 MSI 中提取文件

正如我在上面建议的“Wix 快速入门”帖子中所写:Wix 是亲身实践的只关注简单但完整的真实示例,例如来自 Codeproject 的示例 - 单独阅读文档可能只会令人困惑

专注于将您的应用程序拆分为组件并进行重大升级。 根据经验,每个组件使用一个文件,并阅读此答案以更好地了解组件创建:Change my component GUID in wix?

主要升级是部署软件最常用的升级机制(另一种常见的升级类型是次要升级)。升级已经部署的内容显然至关重要。在部署您的第一个软件版本之前让升级方案生效,以便您对部署解决方案充满信心。

在您设置好组件并且升级解决方案开始工作后,其余部分就位了,您可以按照自己的方式完成应用程序的部署要求并在 Wix 教程网站上查看示例:https://www.firegiant.com/wix/tutorial/.

对于那些直接编写 Wix 代码(没有 GUI 编辑器)的人,我建议您查看此答案以保持源文件简洁:Syntax for guids in WIX?

进一步阅读

Windows Installer and the creation of WiX Installer capabilities, WIX vs InstallShield Express Installshield or Wix WiX Bug Tracker

【讨论】:

很棒的清单。您是否有任何用于在应用程序中接收参数和更新配置文件的自定义操作示例? 从未尝试过,但have a look here 并让我们知道它是否适合上述列表。【参考方案2】:

我现在正在走这条路,我继承了使用 MSI/WiX 安装程序的软件,但正在考虑将我们的流程转换为持续交付并推出无需客户端交互即可安装的更新。我认为鸽洞 nuget 作为 SDK 工具是不正确的,本质上它是一个部署版本化文件集的工具。此外,如果您正在部署的软件已经大量依赖 nuget,并且您已经将程序集打包到 nuget 包中以供内部使用,那么为什么要为此添加额外的技术呢?在你的 msi 中打包一个 nuget.exe,定期调用它的更新,完成。

我知道 WiX 支持创建补丁,但这似乎是事后才想到的。此外,如果您的补丁安装失败怎么办?不按顺序安装补丁?您的主安装程序需要 UAC 权限,而您的补丁不需要?

我认为时代在变,MSI 代表了一种更古老的思考方式。 Chocolatey 就是一个很好的例子,但它仍处于混合阶段,混合了两种技术。

MSI 更像是拉 - 你得到一个包,然后安装它。 Nuget 更像是一种推送策略——你获取一个包的名称,安装它,然后你可以定期调用更新,然后下载并安装一个新版本。

【讨论】:

同意,我会远离补丁包 (.msp)。我几年前编写的一个应用程序使用 .msp 作为更新机制,它经常破坏安装。为了好玩,我查看了我的注册表中使用 .msp 补丁的应用程序(在已安装的数百个应用程序中)并找到了 1 个……我自己的。

以上是关于MSI 与 nuget 包:哪个更适合持续交付?的主要内容,如果未能解决你的问题,请参考以下文章

持续交付-发布可靠软件的系统方法pdf

FluxCDArgoCD或Jenkins X,哪个才是适合你的GitOps工具?

哪个包更适合在真实项目 mongodb 或 mongoose 中使用?

用于 TFS 持续集成的 NuGet 包

云计算与DevOps: 持续集成/持续交付与市场分析

maven 的哪个插件更适合管理发布版本?