我正在为我的基于维克斯的安装程序的升级功能。
由于安装目录的一部分,我们正在安装一个web.config文件,然后使用自定义操作,以更新文件中的连接字符串。
但是,这会导致当我们运行我们的升级问题。 我们希望有安排InstallFinalize后RemoveExistingProducts,因为这是最有效的在不拆卸和重新安装未更改文件的条款。 但是,这叶发生在当Windows安装程序正在试图确定是否应该更新与否时原始web.config文件。 因为它的最后修改日期是比它的创建日期越近,Windows安装程序决定不更新(见版本的规则是Windows Installer使用)。 但是,我们需要它来进行更新。
一个显而易见的解决方案是RemoveExistingProducts的调度改为InstallValidate之后 - 但是这是低效的,而且,我不认为这将让我们有机会从现有的文件迁移设置,难道我们需要做的。
任何其他的想法?
有很多方法 - 但并不理想。
1:您可以使用配套文件 ,迫使有问题的文件的更新。 提供始终指定伴随文件被更新,这可能是要走的路。 从本质上讲,这意味着你的非版本文件链接到它的同伴文件的版本更新逻辑(文件一起更新)。 我从来没有在维克斯用这个,但我认为这是你想“版本遵循”一样容易添加CompanionFile属性的文件元素和指向文件的ID。 里面的MSI文件将是这个样子:
2:您可以使用自定义操作来删除成本核算文件之前, 该文件 (或更好,但其重命名为备份格式)。 问题是,如果安装失败,该文件将被丢失。 如果您重命名文件而不是删除,你可以把它放回盒的设置通过回滚自定义操作失败。 有时我用RemoveFile表删除安装文件,但根据当地InstallExecuteSequence指定的测序,这可能无法正常工作(MSI文件不前的成本必须发生缺失)。
3:再有就是大锤的方法 :集 REINSTALLMODE = amus 给力无论版本覆盖所有文件。 我甚至不应该提到这一点,因为它是可怕的危险(你可以最终覆盖系统文件,或在较新的Windows版本触发一个讨厌的运行时错误的文件保护)。 只将其用于开发测试,并且不认为这是一个快速解决。 它会导致更多的问题比它解决的。
作为一种变型,在可接受的方法可以是设置REINSTALLMODE到鸸鹋 (取代旧和同一版本的文件)。 这可以帮助,如果你不想增加版本号,但保持重建你的二进制文件 - 因为在很多.NET的情况。 我的猜测是,这将导致的问题,一个全新的系列,但- 最显著二进制不同版本,但相同的文件在野外,如果你使用它的公开版本 - 部署的气味 ,如果曾经有过一个。 作为一个QA / DEV只有靠近它可能的工作,虽然。 但严重的是,何必呢? 只是自动递增的二进制文件的内部版本,问题就解决了可靠。
友情链接 :
- 如何显式删除DLL Majorupgrade期间使用维克斯工具箱
只有玄乎的。 你可以早自定义操作删除特定文件,但一定要调节这个权利! 或者你可以指定该文件的版本,以便升级规则将像对待一个版本一个替换非版本的文件,但随后的补丁可以心痒难耐关于有此文件的版本错误。
不要使用自定义操作来更新你的配置文件是其他明显的想法。 相反得到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="data source=[SQLSERVERANDINSTANCE];initial catalog=DatabaseName;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework""
On="install"/>
</Component>
这是通过使用[SQLSERVERANDINSTANCE]变量,需要将前手的设置。
文章来源: Forcing an upgrade of a file that is modified during its initial installation