WIX util:xmlfile Имя файла является атрибутом источника

Я перехожу от Wise Installer к WIX и использую util:xmlfile для обновления файла конфигурации xml.

Это работает.

<Component Id="config" Guid="*">
  <File Id="config" Source="..\Source\Desktop\prodconfig.xml" KeyPath="yes" Vital="yes" />
    <util:XmlFile 
      Id="_PORT_" File="[INSTALLDIR]prodconfig.xml"  
      Action="setValue" 
      Name="Port" Value="[PORT]" 
      ElementPath="//Configuration/CommConnectionPools/CommConnectionPool" 
      Sequence='1' />
  </File>
</Component>

Это не работает.

<Component Id="config" Guid="*">
  <File Id="config" Source="..\Source\Desktop\prod-config.xml" KeyPath="yes" Vital="yes" />
    <util:XmlFile 
      Id="_PORT_" File="[INSTALLDIR]prod-config.xml"  
      Action="setValue" 
      Name="Port" Value="[PORT]" 
      ElementPath="//Configuration/CommConnectionPools/CommConnectionPool" 
      Sequence='1' />
  </File>
</Component>

Когда MSI выполняется с первым компонентом, все в порядке. Во второй версии возвращается ошибка "Ошибка 25531. Не удалось открыть файл XML..."

Насколько я могу судить, единственная разница - это дефис в имени файла.

Любые предложения относительно того, в чем может быть разница?

2 ответа

Решение

Попробуйте использовать идентификатор компонента вместо жесткого кодирования имени

[#config] //which will refer to the File Id

вместо

[INSTALLDIR]prod-config.xml

Значение для File атрибут для util:XmlFile тег должен относиться к Id атрибут для File тег.

В вашем случае это будет

<Component Id="config" Guid="*">
  <File Id="config" Source="..\Source\Desktop\prod-config.xml" KeyPath="yes" Vital="yes" />
    <util:XmlFile 
      Id="_PORT_" File="[#config]"  
      Action="setValue" 
      Name="Port" Value="[PORT]" 
      ElementPath="//Configuration/CommConnectionPools/CommConnectionPool" 
      Sequence='1' />
  </File>
</Component>

В вашем примере, так как вы используете один и тот же идентификатор для обоих Component тег и File пометить это не имеет значения. Но в целом вам нужно использовать идентификатор для File тег.

Чтобы уточнить, если ваш пример использовал configComponent а также configFile соответственно для Component а также File идентификаторы. Это будет выглядеть следующим образом:

<Component Id="configComponent" Guid="*">
  <File Id="configFile" Source="..\Source\Desktop\prod-config.xml" />
    <util:XmlFile 
      Id="_PORT_" File="[#configFile]"  
[snip]
     />
  </File>
</Component>
Другие вопросы по тегам