Подтвердить что ты не робот

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

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

Спасибо и приветствую, forki

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

<?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, возможно, будет очищена, но она работает.)

Ответ 4

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

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

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

Ответ 5

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

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