Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用WixUI_Advanced时,如何将RemoveExistingProducts更改为after InstallFinalize?_Wix_Windows Installer - Fatal编程技术网

使用WixUI_Advanced时,如何将RemoveExistingProducts更改为after InstallFinalize?

使用WixUI_Advanced时,如何将RemoveExistingProducts更改为after InstallFinalize?,wix,windows-installer,Wix,Windows Installer,以下是我的设想: 使用WIX3.6 使用WixUI\u Advanced对话框集(增加了在安装过程中控制单个功能的能力) 为web.config组件设置NeverOverwrite=“yes”(以便安装后不会丢失本地更改) 但是,在升级过程中,安装程序似乎仍然会删除并重新安装web.config文件 据我所知,WixUI\u Advanced对话框集的配置如下: 以下是安装过程中的日志片段: MSI (s) (74:8C) [18:37:00:959]: Executing op: Ac

以下是我的设想:

  • 使用WIX3.6
  • 使用
    WixUI\u Advanced
    对话框集(增加了在安装过程中控制单个功能的能力)
  • web.config
    组件设置
    NeverOverwrite=“yes”
    (以便安装后不会丢失本地更改)
但是,在升级过程中,安装程序似乎仍然会删除并重新安装
web.config
文件

据我所知,
WixUI\u Advanced
对话框集的配置如下:


以下是安装过程中的日志片段:

MSI (s) (74:8C) [18:37:00:959]: Executing op: ActionStart(Name=InstallInitialize,,)
Action 18:37:00: InstallInitialize. 
...
Action 18:37:00: ProcessComponents. Updating component registration
...
Action 18:37:00: UnpublishFeatures. Unpublishing Product Features
...
UnpublishFeatures: Feature: ProductFeature
...
UnpublishFeatures: Feature: AdditionalFeature
...
MSI (s) (74:8C) [18:37:00:967]: Executing op: ActionStart(Name=RemoveFiles,Description=Removing files,Template=File: [1], Directory: [9])
Action 18:37:00: RemoveFiles. Removing files
MSI (s) (74:8C) [18:37:00:967]: Executing op: ProgressTotal(Total=2,Type=1,ByteEquivalent=175000)
MSI (s) (74:8C) [18:37:00:967]: Executing op: SetTargetFolder(Folder=C:\Program Files (x86)\MyTestApp\WebApp\)
MSI (s) (74:8C) [18:37:00:967]: Executing op: FileRemove(,FileName=web.config,,ComponentId={B4A12A8F-56A3-4DD1-A0BA-B9C39EB305FD})
RemoveFiles: File: web.config, Directory: C:\Program Files (x86)\MyTestApp\WebApp\
MSI (s) (74:8C) [18:37:00:968]: Verifying accessibility of file: web.config
MSI (s) (74:8C) [18:37:00:969]: Note: 1: 2318 2:  
MSI (s) (74:8C) [18:37:00:969]: Note: 1: 2318 2:  
MSI (s) (74:8C) [18:37:00:969]: Executing op: FileRemove(,FileName=somefile.txt,,ComponentId={B835CEF5-1A84-4C37-8CB0-BE983BAF73F9})
RemoveFiles: File: somefile.txt, Directory: C:\Program Files (x86)\MyTestApp\WebApp\
MSI (s) (74:8C) [18:37:00:970]: Verifying accessibility of file: somefile.txt
MSI (s) (74:8C) [18:37:00:970]: Note: 1: 2318 2:  
MSI (s) (74:8C) [18:37:00:970]: Note: 1: 2318 2:  
MSI (s) (74:8C) [18:37:00:971]: Executing op: ActionStart(Name=PublishProduct,Description=Publishing product information,)
Action 18:37:00: PublishProduct. Publishing product information
...
Action 18:37:00: RollbackCleanup. Removing backup files
RollbackCleanup: File: C:\Config.Msi\7cd65c.rbf
RollbackCleanup: File: C:\Config.Msi\7cd65d.rbf
MSI (s) (74:8C) [18:37:00:980]: Note: 1: 2318 2:  
MSI (s) (74:8C) [18:37:00:981]: Note: 1: 2318 2:  
MSI (s) (74:8C) [18:37:00:981]: No System Restore sequence number for this installation.
MSI (s) (74:8C) [18:37:00:981]: Unlocking Server
MSI (s) (74:8C) [18:37:00:985]: PROPERTY CHANGE: Deleting UpdateStarted property. Its current value is '1'.
Action ended 18:37:00: InstallFinalize. Return value 1.
Action ended 18:37:00: INSTALL. Return value 1.
如您所见,它在
InstallInitialize

当我尝试更改wxs文件时,添加:


我得到:

error LGHT0091: Duplicate symbol 'WixAction:InstallExecuteSequence/RemoveExistingProducts' found. This typically means that an Id is duplicated. Check to make sure all your identifiers of a given type (File, Component, Feature) are unique.
下面是我正在使用的
Product.wxs
文件:


未检测到新的错误
如何将RemoveExistingProducts更改为InstallFinalize之后的产品? 最终,我只需要这个文件永远不会被覆盖


谢谢

MajorUpgrade标签是进行升级的首选方式,这将在您指定的位置对RemoveExistingProducts(REP)进行排序-这将简化其中的一些操作。用户界面没有理由四处移动

调度REP的默认值是InstallValidate之后,这基本上是先卸载旧产品,然后安装升级,因此与其说是更新/覆盖配置文件,不如说是先卸载/删除,然后重新安装

如果REP计划在InstallExecute之后执行,则覆盖规则将在升级期间应用(因为升级会在卸载之前“覆盖”现有已安装的产品)。web.config文件只需在新旧产品中具有相同的组件id,如果在安装后确实发生了更改,则覆盖规则应意味着它不会被覆盖

换句话说,只需将主升级元素与afterInstallExecute一起使用,在新旧资源(文件等)中具有相同的组件ID,web.config文件不应被覆盖,并且不需要设置neveroverwrite


在我看来,让REP afterInstallExecute优于AfterInstallFinalize,因为后者在安装事务之外,因此升级安装可能会成功,然后REP AfterInstallFinalize可能会失败并回滚,从而使两个产品同时安装。如果卸载旧产品失败,事务中有REP将导致完全回滚

MajorUpgrade标签是进行升级的首选方式,这将在您指定的位置对RemoveExistingProducts(REP)进行排序-这将简化其中的一些操作。用户界面没有理由四处移动

调度REP的默认值是InstallValidate之后,这基本上是先卸载旧产品,然后安装升级,因此与其说是更新/覆盖配置文件,不如说是先卸载/删除,然后重新安装

如果REP计划在InstallExecute之后执行,则覆盖规则将在升级期间应用(因为升级会在卸载之前“覆盖”现有已安装的产品)。web.config文件只需在新旧产品中具有相同的组件id,如果在安装后确实发生了更改,则覆盖规则应意味着它不会被覆盖

换句话说,只需将主升级元素与afterInstallExecute一起使用,在新旧资源(文件等)中具有相同的组件ID,web.config文件不应被覆盖,并且不需要设置neveroverwrite

在我看来,让REP afterInstallExecute优于AfterInstallFinalize,因为后者在安装事务之外,因此升级安装可能会成功,然后REP AfterInstallFinalize可能会失败并回滚,从而使两个产品同时安装。如果卸载旧产品失败,事务中有REP将导致完全回滚

这个场景如何(按时间顺序)1)安装2)更新已安装配置3)更新配置,创建新msi 4)运行安装。现在安装的配置是2还是3?我想从2点开始。基本上,在初始安装后不更新配置。如果文件不存在(如果出于某种原因被删除),我可以只更新文件。如果步骤2)是用户修改文件(不是安装程序),那么步骤4)后的结果将是步骤2)版本。这种情况如何(按时间顺序)1)安装2)更新安装配置3)更新配置,创建新的msi(4)运行安装。现在安装的配置是2还是3?我想从2点开始。基本上,在初始安装后不更新配置。如果文件不存在(如果出于某种原因被删除),我可以只更新它。如果第2步是用户修改文件(不是安装程序),那么第4步之后的结果将是第2步的版本。