WiX перезаписывает файлы конфигурации во время установки. Как я могу избежать этого? - PullRequest
20 голосов
/ 14 марта 2010

Я использую WiX для создания установщика Windows. К сожалению, мой установщик перезаписывает файл конфигурации при каждом обновлении. Что я действительно хочу, так это то, что установщик создает файл, только если он не найден.

Спасибо и всего наилучшего, forki

Ответы [ 5 ]

33 голосов
/ 31 августа 2010

Атрибут Component @NeverOverwrite="yes" может быть решением этой проблемы.

Из справочной документации WiX:

Если для этого атрибута установлено значение «да», программа установки не устанавливает и не переустанавливает компонент, если файл пути к ключу или запись реестра пути к ключу для этого компонента уже существует. Приложение регистрируется как клиент компонента. Используйте этот флаг только для компонентов, которые регистрируются таблицей реестра. Не используйте этот флаг для компонентов, зарегистрированных в таблицах AppId, Class, Extension, ProgId, MIME и Verb.

Документация по элементам

9 голосов
/ 13 сентября 2011

Component/@NeverOverwrite="yes" сделает это. Просто не забудьте установить File/@KeyPath="yes" для одного или нескольких файлов, чтобы он мог определить, присутствует ли он уже.

Если вы используете heat.exe для автоматического сбора списка файлов, вы можете использовать следующую таблицу стилей XSLT, чтобы установить этот атрибут для каждого компонента, содержащего файл конфигурации (и задать каждый элемент файла конфигурации в качестве ключевого пути). 1005 *

<?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, вероятно, может быть очищена, но это работает.)

5 голосов
/ 14 марта 2010

Я уверен, что кто-то придет с правильным ответом, но в качестве резервной копии:

Вы можете попросить установщика создать файл конфигурации по умолчанию, а затем скопировать файл по умолчанию в ваше приложение, если файл нормальной конфигурации отсутствует. Это также обеспечивает простой способ сброса приложения к заводским настройкам (просто удалите файл конфигурации).

4 голосов
/ 16 марта 2010

Это действительно ошибка приложения, а не проблема установки.

Вы не должны «устанавливать» данные, которые впоследствии будут редактироваться пользователем, установщик Windows записывает размер, дату изменения и значение хеш-функции установленных файлов. Таким образом, если позже файл «поврежден», его можно исправить.

Мы устанавливаем файл конфигурации по умолчанию, который копируется в пользовательскую конфигурацию, когда ничего не найдено, таким образом установщик Windows даже не знает о редактируемой пользователем конфигурации и поэтому не делает никакой замены.

1 голос
/ 14 марта 2010

Вы можете изменить поведение по умолчанию с помощью свойства REINSTALLMODE . По умолчанию это «Переустановить, если файл отсутствует или является более старой версией», что логично правильно, как для меня. Но вы можете поэкспериментировать с другими значениями, чтобы найти нужное вам поведение.

Надеюсь, это поможет.

...