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

Почему мой установщик WiX нуждается в пустой CreateFolder для условного обновления Xml файла?

TL; DR: зачем мне нужен пустой элемент <CreateFolder/> в этом условном компоненте, чтобы заставить его работать?

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

Одна из настроек - создать конкретную настройку приложения, только если определено свойство RUNTIME. Здесь компонент WiX для этого:

  <Component Id="C.Rbnz.Fsis.CollectionPeriodService.exe.config.runtime"
             Guid="*">
    <Condition>
      <![CDATA[RUNTIME]]>
    </Condition>

    <CreateFolder/>

    <util:XmlFile Id="X.Runtime.1"
                  Action="createElement"
                  ElementPath="/configuration/appSettings"
                  File="[#F.Rbnz.Fsis.CollectionPeriodService.exe.config]"
                  Name="add"
                  Sequence="2"/>

    <util:XmlFile Id="X.Runtime.2"
                  File="[#F.Rbnz.Fsis.CollectionPeriodService.exe.config]"
                  ElementPath="/configuration/appSettings/add[\[]not(@key)[\]]"
                  Action="setValue"
                  Name="key"
                  Value="RunTime"
                  Sequence="3"/>

    <util:XmlFile Id="X.Runtime.3"
                  File="[#F.Rbnz.Fsis.CollectionPeriodService.exe.config]"
                  ElementPath="/configuration/appSettings/add[\[]@key='RunTime'[\]]"
                  Action="setValue"
                  Name="value"
                  Value="[RUNTIME]"
                  Sequence="4"/>

  </Component>

Это работает так, как я хочу - если RUNTIME указан в командной строке для msiexec, создается новый элемент; если нет, ничего не происходит.

Почему у меня должен быть пустой <CreateFolder/> внутри этого компонента?

Пока я пытался получить эту работу, я обнаружил "" Заявление о состоянии Wix", в котором показан рабочий компонент, но не объясните, почему <CreateFolder/> необходимо.

Удаление <CreateFolder/> дает мне эту ошибку:

ICE18: KeyPath для компонента: "C.Rbnz.Fsis.CollectionPeriodService.exe.config.runtime" - это каталог: "INSTALLDIR". Параметр Directory/Component должен быть указан в таблице CreateFolders.

который, я уверен, достаточно информативен, когда вы знаете, что это значит.

4b9b3361

Ответ 1

Каждый компонент имеет ключевой путь; наиболее распространенным является файл. У вашего компонента нет файла или другого ключевого пути, поэтому WiX предоставляет ему значение по умолчанию для каталога. Затем появляется установщик Windows и говорит, что компоненты с путями ключей каталога должны гарантировать, что каталог будет создан, даже если что-то еще сделает это. Это глупое правило с легким исправлением.

Ответ 2

Вместо этого вы можете использовать параметр KeyPath = "yes" в теге компонента. Только если "INSTALLDIR" - правильный путь для этого компонента.