WiX会在安装过程中覆盖配置文件.我怎么能避免这个?

for*_*i23 20 installer windows-installer wix configuration-files

我正在使用WiX来创建Windows安装程序.不幸的是,我的安装程序会在每次更新时覆盖配置文件.我真正想要的是,如果找不到,安装程序只会创建该文件.

谢谢和问候,forki

Dav*_*sen 34

Component @NeverOverwrite="yes"属性可能是此问题的解决方案.

从WiX帮助文档:

如果此属性设置为"yes",则如果组件的密钥路径文件或密钥路径注册表项已存在,则安装程序不会安装或重新安装该组件.应用程序将自身注册为组件的客户端.仅将此标志用于Registry表正在注册的组件.不要将此标志用于AppId,Class,Extension,ProgId,MIME和Verb表注册的组件.

组件元素文档

  • 最好的做法是将每个文件都作为自己的组件.http://stackoverflow.com/questions/1602831/wix-one-file-per-component-or-several-files-per-component (2认同)
  • @Dave Andersen:我相信,该文件将被InstallExecuteSequence> RemoveExistingProducts删除,这是一个必须的元素.我想知道,关于22个upvotes,因为它显然不起作用. (2认同)

Ric*_*all 9

Component/@NeverOverwrite="yes"会这样做.只需记住设置File/@KeyPath="yes"一个或多个文件,以便它可以检测它是否已经存在.

如果您使用heat.exe自动收集文件列表,则可以使用以下XSLT样式表在包含配置文件的每个Component上设置此属性(并将每个配置文件元素设置为键路径).

<?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>
Run Code Online (Sandbox Code Playgroud)

(注意:XML命名空间处理可能会被清除,但它可以工作.)


Dou*_*der 5

我确定有人会提出正确的答案,但作为备份:

您可以让安装程序创建默认配置文件,然后让应用程序将默认文件复制到正常配置文件(如果没有正常配置文件).这也提供了一种将应用程序重置为出厂默认设置的简便方法(只需删除配置文件).


sas*_*ont 5

这确实是一个应用程序错误,而不是设置问题。

您不应该“安装”以后可由用户编辑的数据,Windows Installer 会记录已安装文件的大小、修改日期和哈希值。这样,如果后来发现文件“损坏”,则可以修复它。

我们安装一个默认配置文件,当没有找到时,该文件被复制到用户配置中,这样 Windows Installer 甚至不知道用户可编辑的配置,因此不会进行任何替换。

  • 安装时配置的配置文件呢?例如,具有安装特定连接字符串的 app.config 或 web.config。如果安装后需要更改此连接字符串怎么办? (7认同)