【问题标题】:Forcing an upgrade of a file that is modified during its initial installation强制升级在初始安装期间修改的文件
【发布时间】:2009-09-16 10:52:52
【问题描述】:

我正在为我的基于 WiX 的安装程序开发升级功能。

作为安装的一部分,我们正在安装一个 web.config 文件,然后使用自定义操作来更新文件内的连接字符串。

但这会在我们运行升级时引起问题。我们希望在 InstallFinalize 之后安排 RemoveExistingProducts,因为这在不删除和重新安装未更改的文件方面最有效。但这会在 Windows Installer 尝试确定是否应该更新它时保留原始 web.config 文件。由于它的最后修改日期比它的创建日期新,Windows Installer 决定不更新它(请参阅 Windows Installer 使用的versioning rules)。但我们需要更新它。

一个明显的解决方案是将 RemoveExistingProducts 的调度更改为在 InstallValidate 之后进行 - 但这是低效的,而且,如果我们需要这样做,我认为它不会让我们有机会从现有文件迁移设置。

还有其他想法吗?

【问题讨论】:

    标签: wix windows-installer installation upgrade


    【解决方案1】:

    较新的答案: 1) 伴随文件,2) 使用 Visual Studio 的文件版本破解, 3) 将文件移动到另一个安装路径,4) REINSTALLMODE 的变体,5)“版本在说”等。 . 各种选项,大部分都不理想:

    以下是较旧的答案。我认为选项 2 不再正常工作:


    有很多方法 - 没有一种是理想的。

    1:您可以使用伴随文件来强制更新相关文件。如果指定的伴随文件总是得到更新,这可能是要走的路。本质上,这意味着您将非版本化文件链接到其伴随文件的版本更新逻辑(文件一起更新)。我从未在 WIX 中使用过它,但我认为这就像将 CompanionFile 属性 添加到 File 元素并指向要“版本跟随”的文件的 ID 一样简单。在 MSI 文件中,它看起来像这样:

    2:您可以在计算文件成本之前使用自定义操作删除文件(或者更好的是,将其重命名为备份格式)。问题是如果设置失败,文件将丢失。如果您重命名文件而不是删除文件,则可以将其放回原处,以防设置通过回滚自定义操作失败。有时我使用 RemoveFile 表在安装时删除文件,但根据 InstallExecuteSequence 中指定的顺序,这可能不起作用(必须在 msi 执行文件成本计算之前进行删除)。

    3:然后是大锤方法:设置REINSTALLMODE = amus 强制覆盖所有文件,无论版本如何。我什至不应该提及这一点,因为它非常危险(您最终可能会覆盖系统文件,或者在较新的 Windows 版本上,由于文件受到保护,会触发令人讨厌的运行时错误)。仅将其用于开发测试,不要认为它是快速修复。它带来的问题多于解决的问题。

    作为一种变体,可接受的方法可能是将 REINSTALLMODE 设置为 emus(替换旧的和相同版本的文件)。如果您不想增加版本号但要继续重建二进制文件,这会有所帮助——就像许多 .NET 中的情况一样。我的猜测是,这将导致一系列全新的问题 - 如果您将其用于公开发布,最明显的是二进制不同但版本相同的文件 - >部署气味如果有的话。作为一个 QA/DEV 唯一的方法,它可以工作。但说真的,为什么要打扰?只需自动增加二进制文件的构建版本即可可靠地解决问题。


    链接

    【讨论】:

    • wix.mindcapers.com/wiki/Companion_File 了解如何在 WIX 中实现伴随文件方法的快速示例。
    • 配套文件方法看起来可能是要走的路。感谢您的链接。也感谢关于 REINSTALLMODE 的警告:我已经阅读过,并且正在考虑它 - 不再!
    • 该死,wix.mindcapers.com/wiki/Companion_File 已脱机:(
    • 我相信 Wix 让伴侣文件的使用变得容易。我认为这只是您在文件或组件标签中设置的属性。请参阅上面添加的图像,了解它是如何在常规 MSI 文件中实现的。
    • @Glytzhkof 如果您不安装任何系统文件,REINSTALLMODE 如何覆盖系统文件?
    【解决方案2】:

    只有不确定的。您可以使用自定义操作及早删除特定文件,但请务必对此进行调整!或者您可以为文件指定一个版本,以便升级规则将其视为用版本化文件替换非版本化文件,但随后补丁可能会因为该文件的错误版本而感到不安。

    【讨论】:

    • 您是否暗示伴随文件会导致补丁出现问题?如果是这样,只包含整个文件是否有帮助?
    • 如果您进行二进制差异并且基础对版本撒谎,则会出现补丁问题。所以包括整个文件确实可以提供帮助,但它仍然不完美。我相信伴随文件的故事表现得更好。
    【解决方案3】:

    不要使用自定义操作来更新您的配置文件是另一个明显的想法。而是让 WIX 通过 XML 扩展进行更新。例如

    <Component Id="web.config" Guid="f12ff575-ad5f-47bc-a5c9-40b1e3a7f9f5" >
        <File Source="$(var.SrcPath)\web.config.config" KeyPath="yes" />
    
        <util:XmlConfig Id="AppSqlInstanceName"
                        File="[#web.config]"
                        Action="create"
                        ElementPath="//configuration/connectionStrings/add[\[]@name='YourStringKey'[\]]"
                        Name="connectionString"
                        Node="value"
                        Value="metadata=res://*/YourModel.csdl|res://*/YourModel.ssdl|res://*/YourModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=[SQLSERVERANDINSTANCE];initial catalog=DatabaseName;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;"
                        On="install"/>
    </Component>
    

    这是使用需要事先设置的 [SQLSERVERANDINSTANCE] 变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-04
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      相关资源
      最近更新 更多