【问题标题】:WiX: Managed to not overwrite config file during upgrade, however shortcuts are removedWiX:在升级期间设法不覆盖配置文件,但是删除了快捷方式
【发布时间】:2013-08-09 19:34:27
【问题描述】:

我有类似的问题,例如bring Wix to not overwrite a configuration file during upgrade 的 forki23。我有一个配置文件,在升级过程中不应被覆盖,但在卸载过程中应将其删除。但是,我找到的每个解决方案都会破坏其他东西。

如果我设置NoOverwrite=yes and move the RemoveExistingProducts to InstallFinalize,配置文件会按照我的意愿进行处理。但是,在这种情况下,由于某种原因,在升级过程中会删除快捷方式。如果我在 InstallInitialize 处保留 RemoveExistingProducts,则配置文件实际上在升级过程中被删除,但是存在快捷方式。

为什么会发生这种情况,有办法解决吗?

<InstallExecuteSequence>
   <RemoveExistingProducts After="InstallInitialize" />
   <!-- InstallInitialize causes config-file to disappear during upgrade -->
   <!-- InstallFinalize causes shortcuts to disappear during upgrade -->

...

<Property Id="DISABLEADVTSHORTCUTS" Value="1" />

...

<Directory Id="INSTALLLOCATION" Name="MyApp">
  <Component Id="MYAPP.EXE" DiskId="1" Guid="...">
    <File Id="MYAPP.EXE" Name="MyApp.exe" Source="..." Vital="yes" KeyPath="yes">
      <Shortcut Id="startmenuShortcut" 
                Directory="ProgramMenuDir" 
                Name="!(loc.ProductName)" 
                WorkingDirectory='INSTALLLOCATION' 
                Icon="Icon.ico" 
                IconIndex="0" 
                Advertise="yes"  />
    </File>
    <RegistryValue Root="HKLM" 
                    Name="InstallLocation" 
                    Key="$(var.InstallLocationRegistryKey)" 
                    Type="string" 
                    Value="[INSTALLLOCATION]">
    </RegistryValue>
  </Component>
  <Component Id="MYAPP.EXE.CONFIG" DiskId="1" Guid="..." NeverOverwrite="yes">
    <File Id="MYAPP.EXE.CONFIG" 
          Name="MyApp.exe.config" 
          Source="..." 
          KeyPath="yes" />
  </Component>
...
</Directory>

...

<Directory Id="ProgramMenuFolder">
    <Directory Id="ProgramMenuDir" Name="!(loc.ProductPrefix)">
        <Component Id="ProgramMenuDir" Guid="...">
            <RegistryValue Root="HKCU" Key="SOFTWARE\MyApp" 
                           Type="string" Value="[INSTALLLOCATION]" KeyPath="yes" />         
            <RemoveFolder Id="ProgramMenuDir" On="uninstall"/>
        </Component>
    </Directory>
</Directory>

注意 A:配置文件是机器范围的配置,应该适用于所有用户。

注意 B:我使用的是 WiX 3.7,目标平台是 Windows 7 和 8。

【问题讨论】:

  • 只是为了让您知道有关在何处安排 RemoveExistingProducts 的链接...jpassing.com/2007/06/16/… 它可能无法解决您的问题,但至少可以帮助您了解有关 Windows Installer 的更多信息。

标签: wix installation windows-installer wix3.7


【解决方案1】:

理论上“NoOverwrite=yes 并将 RemoveExistingProducts 移动到 InstallFinalize”应该可以工作,但很明显我们正在从大局中失去一些东西。查看 Windows Installer 为何删除快捷方式的最佳方法是在启动升级设置时创建详细日志。您可以使用以下命令在 cmd.exe 中执行此操作:msiexec /i [msi path] /L*V debug.log

发布日志的下载链接和托管快捷方式的组件的 GUID,以便我们查看日志是否有助于我们了解发生的情况。

【讨论】:

    【解决方案2】:

    Windows 安装程序在这些事情上的工作非常准确,如果在 After="InstallFinalize" 情况下删除了任何内容,这意味着一个组件已被删除,MSI 认为不需要,因为您的新版本中不包含的 msi 文件。确保包含 MYAPP.exe 的组件的 GUID 和快捷方式在您的新版本中没有更改。 (与 Orce 或 Insted 等工具进行比较)。好像有!

    MSI 仅删除完整组件,而不仅仅是快捷方式。真的!也许您在 Windows 中遇到了快捷方式的更新问题。有时会发生这样的事情。尝试重新启动以确保发生这种情况,您的想法。也许您的测试过程中有错误(或者是上面提到的 GUID 问题)。如果您没有删除快捷方式的自定义操作,或者您尝试将快捷方式添加为文件或类似危险​​的东西,那么其他可能性并不多。

    将快捷方式放在与 .exe 相同的组件中很常见,但在我看来并不是最佳选择!我建议尽可能地分离资源,所以把它放在一个自己的组件中。如果您以后想重命名快捷方式,这有好处。然后你可以只改变这个组件的GUID,重要的.exe文件不会被触及。

    这样做有一个小缺点,在重装情况下会失去与文件版本 MYAPP.exe 的直接连接,因此如果 MYAPP.exe 是多个不同设置之间的共享文件,则不建议这样做。完美的解决方案是可能的,但不是这里的重点。

    【讨论】:

      【解决方案3】:

      解决方法:如果您仍然能够更改旧的(第一个)msi 设置,只需将组件 MYAPP.EXE.CONFIG 标记为永久。那么在Major Upgrade的时候就不会卸载了(但是根本没有卸载,有什么优缺点,也就是说,对于.config文件来说大部分都可以接受)。

      如果您的设置版本 1 已经发布,那么您也可以通过一些技巧来做同样的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-26
        相关资源
        最近更新 更多