如何避免WiX/MSI部署解决方案中的常见设计缺陷?
部署是大多数开发的关键部分 - 部署失败意味着您的最终用户永远无法评估您的产品.这很容易成为软件开发中最昂贵的错误.请给这个内容一个机会.我坚信,通过应用程序设计的微小变化可以显着提高软件质量,使部署更加合理,更可靠 - 这就是"答案"的全部 - 软件开发.
这是一个Q/A风格的问题,答案只列出了MSI文件中不要做的一些事情,以避免最常见的设计缺陷.
windows-installer installshield wix advanced-installer installshield-le
MyApp版本1.0包含文件foo.dll.此文件的版本是10.5.567版.现在MyApp是2.0版,foo.dll版本是2.0.123.版本低于旧版本.编写此dll的供应商决定使用文件版本号向后退.这不是我可以改变的决定.
如何让WiX始终安装此文件?
RemoveExistingProducts操作在InstallFinalize操作之后计划,也无法更改.
InstallShield有一个'always overwrite'标志,但我不认为我可以在不通过编译器开关更改所有文件的行为的情况下模仿它.我不想要这个.我只是想更新这个文件.
我也试过了
<RemoveFile Id="foo.dll" On="install" Name="foo.dll" />
Run Code Online (Sandbox Code Playgroud)
但这也不起作用.我最终收到'错误2753文件foo.dll未标记为安装'.
我有一个非常简单的安装程序 - 将一个DLL复制到Program Files子文件夹并使用regsvr32.exe注册它.效果很好,但是如果安装了旧版本的dll,"修复"不会覆盖现有的dll.dll已签名,其版本(构建)编号始终递增(例如2.0.0.123 - > 2.0.0.124).
查看以前的类似帖子,我添加了RemoveExistingProducts并将ProductId指定为"*".卸载然后安装新版本工作正常,但我真的需要修复来更新现有的dll.
还有什么我需要做的吗?
谢谢!
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<!--
When creating a new install for the next version, these fields must be modified
-->
<?define ProductVersion = "2.0.00" ?>
<?define ProductId64 = "*" ?>
<?define ProductId32 = "*" ?>
<?define PackageId = "45F34788-66AC-441C-B666-707FFA7F1EE9" ?>
<!-- Product name as you want it to appear in Add/Remove Programs-->
<?if $(var.Platform) = x64 ?>
<?define ProductName = "XYZ (64 bit)" ?>
<?define Win64 = "yes" …Run Code Online (Sandbox Code Playgroud) 我想我在某处读过它,但现在找不到来源并且无法确认它:当安装(主要升级)来自 MSI 的较新版本时,如果文件已被修改(由安装程序或用户),则默认规则是旧文件不会被新版本的相同文件替换吗?
我想我也观察到我之前编写的安装程序中的行为,但现在经过一些更改后,似乎它总是会替换旧的修改配置文件!
产品定义:
<Product Id="*" Name="$(var.ProductName)" Language="1033" Version="$(var.ProductVersion)" Manufacturer="Advanced Software Solution" UpgradeCode="$(var.UpgradeCode)">
<Package Id="*" InstallerVersion="200" Description="The web service installer" Compressed="yes"
InstallScope="perMachine"/>
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
Run Code Online (Sandbox Code Playgroud)
组件定义:
<Component Id='WebConfigComp' Guid='GUID'>
<File Id='WebConfigFile' Name='Web.config' Source='$(var.TheWebService.WCF.TargetBinPath)\Web.Distribution.config'
KeyPath='yes'>
</File>
</Component>
Run Code Online (Sandbox Code Playgroud)
安装执行序列
FindRelatedProducts 25
AppSearch 50
LaunchConditions 100
ValidateProductID 700
myScripts_CA 799
CostInitialize 800
FileCost 900
CostFinalize 1000
MigrateFeatureStates 1200
InstallValidate 1400
RemoveExistingProducts 1401
InstallInitialize 1500
BackupCA Installed 1501
ProcessComponents 1600
UnpublishFeatures 1800
SchedSecureObjectsRollback_x64 VersionNT > 400 …Run Code Online (Sandbox Code Playgroud) 我们正在尝试为我们的产品部署更新,其中包含更新的 dll。该 dll 也有一个版本号,因此通常安装程序应该能够看到它并替换旧的 dll。
Windows 安装程序在检查版本号时只关心前三个数字。然而,在这种情况下,更新后的版本号看起来与第四个版本号相同。例如,如果前一个版本为 1.0.0.12,则此版本为 1.0.0.20,因此安装程序会将它们视为相同版本,并且不会替换该文件。在这种情况下,我无法控制版本编号,并且由于我们包含了很多 dll,因此将来可能会再次发生这种情况。
无论版本号是否相同,如何让安装程序替换该文件?
在搜索不同的解决方案后,我尝试告诉安装程序在安装过程中删除该文件。如果没有必要,我不想删除所有文件。到目前为止,我已经尝试了包含的代码片段中所示的解决方案。该版本的安装程序中新增了删除文件元素。
<Component Id="SomeComponent" Win64="yes" Guid="*">
<File Id="SomeFile" KeyPath="yes" Source="$(var.app.TargetDir)\some.dll" />
<RemoveFile Id="RemoveSomeFile" Name="some.dll" On="install"/>
</Component>
Run Code Online (Sandbox Code Playgroud)
我期望的结果是旧的 dll 被新的 dll 替换,但是安装后旧的 dll 仍然存在,没有新的 dll。
我有一个wix安装程序,它将安装一个XML文件,然后进行修改.安装工作很棒.今天,我需要为这个XML文件添加几个节点.所以我修改了原始文件,然后添加了一些额外的指令给wix来分配这些项目值.
好吧,我每次都说它无法找到节点时出错.我查看并查看它在目录中的文件,它仍然具有没有该节点的旧文件.如何告诉它先替换XML文件然后修改它?我不想使用"CreateElement",因为我不知道如果它已经存在,如何不创建元素(没有尝试过,所以也许它可以工作).此外,我希望我的XML文件是配置的定义.
这是我的XML示例:
<Component Id="MyProgExeConfigComponent" Guid="*">
<File
Id="MyProgExeConfig"
Name="MyProg.exe.config"
DiskId="1"
Source="../Published/MyProg/MyProg.exe.config"
PatchWholeFile="yes"
KeyPath="yes"/>
<util:XmlFile
Id="MyProgExeConfigUser"
Action="setValue"
Permanent="yes"
File="[INSTALLLOCATION]\MyProg.exe.config"
ElementPath="/configuration/appSettings/add[\[]@key='UserName'[\]]"
Name="value"
Value="[USER]"/>
<util:XmlFile
Id="MyProgExeConfigPassword"
Action="setValue"
Permanent="yes"
File="[INSTALLLOCATION]\MyProg.exe.config"
ElementPath="/configuration/appSettings/add[\[]@key='Password'[\]]"
Name="value"
Value="[PASSWORD]" />
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?