我正在使用WiX创建Windows安装程序。不幸的是,我的安装程序会在每次更新时覆盖配置文件。 我真正想要的是,如果找不到文件,安装程序只会创建文件。
谢谢和问候, forki
答案 0 :(得分:33)
Component @NeverOverwrite="yes"
属性可能是此问题的解决方案。
来自WiX帮助文档:
如果此属性设置为“yes”,则如果组件的密钥路径文件或密钥路径注册表项已存在,则安装程序不会安装或重新安装该组件。应用程序将自身注册为组件的客户端。仅将此标志用于Registry表正在注册的组件。不要将此标志用于AppId,Class,Extension,ProgId,MIME和Verb表注册的组件。
答案 1 :(得分:9)
Component/@NeverOverwrite="yes"
会这样做。只需记住在一个或多个文件上设置File/@KeyPath="yes"
,以便它可以检测它是否已经存在。
如果您正在使用heat.exe自动收集文件列表,则可以使用以下XSLT样式表在包含配置文件的每个Component上设置此属性(并将每个配置文件元素设置为键路径)。 / p>
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
exclude-result-prefixes="msxsl wix">
<xsl:output method="xml" indent="yes" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//*[local-name()='Component']">
<wix:Component Id="{@Id}" Directory="{@Directory}" Guid="{@Guid}">
<xsl:if test="contains(*[local-name()='File']/@Source, '.config')">
<xsl:attribute name="NeverOverwrite">yes</xsl:attribute>
</xsl:if>
<xsl:apply-templates select="@* | node()"/>
</wix:Component>
</xsl:template>
<xsl:template match="@KeyPath">
<xsl:choose>
<xsl:when test="contains(parent::node()/@Source, '.config')">
<xsl:attribute name="KeyPath">
<xsl:value-of select="'yes'"/>
</xsl:attribute>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
(注意:XML命名空间处理可能会被清除,但它可以工作。)
答案 2 :(得分:5)
我确定有人会提出正确的答案,但作为备份:
您可以让安装程序创建默认配置文件,然后让应用程序将默认文件复制到正常配置文件(如果没有正常配置文件)。这也提供了一种将应用程序重置为出厂默认设置的简便方法(只需删除配置文件)。
答案 3 :(得分:4)
这确实是一个应用程序错误,而不是设置问题。
您不应该“安装”以后可由用户编辑的数据,Windows Installer会记录安装的文件的大小,修改日期和哈希值。这样,如果后来发现该文件“损坏”,则可以修复它。
我们安装了一个默认配置文件,当找不到任何配置文件时,该文件被复制到用户配置,这样Windows Installer甚至不知道用户可编辑的配置,因此不会进行任何替换。
答案 4 :(得分:1)
您可以使用REINSTALLMODE property更改默认行为。它默认为“重新安装,如果文件丢失或是旧版本”,这在逻辑上是正确的,对我来说。但您可以尝试使用其他值来查找所需的行为。
希望这有帮助。