Как проверить свойство CustomAction (Wix)? - PullRequest
0 голосов
/ 18 июня 2009

Я пытаюсь собрать небольшой диалог «предварительных условий» в Wix, чтобы дать пользователям уверенность в том, что у них есть все необходимое для запуска моего программного обеспечения:

Например, мне нужен Managed DirectX, поэтому я ищу некоторые DLL:

<Property Id="MANAGED_DIRECTX">
  <DirectorySearch Path="$(env.SystemRoot)\Microsoft.NET\DirectX for Managed Code\1.0.2902.0" Depth="0" Id="MDXDir">
    <FileSearch Name="Microsoft.DirectX.dll"/>
  </DirectorySearch>
</Property>

<Property Id="MANAGED_DIRECTX_DIRECTINPUT">
  <DirectorySearch Path="$(env.SystemRoot)\Microsoft.NET\DirectX for Managed Code\1.0.2902.0" Depth="0" Id="MDXInputDir">
    <FileSearch Name="Microsoft.DirectX.DirectInput.dll"/>
  </DirectorySearch>
</Property>

У меня также есть CustomAction для объединения моей логики условий:

<CustomAction Id="SetManagedDirectXInstalled"
              Property="MANAGED_DIRECTX_INSTALLED"
              Value="NOT([MANAGED_DIRECTX] = '') AND NOT ([MANAGED_DIRECTX_DIRECTINPUT] = ''")/>

Этот CustomAction упорядочен:

<InstallExecuteSequence>
  <Custom Action="SetManagedDirectXInstalled" After="AppSearch" />
  <RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>

Теперь я должен уметь использовать «MANAGED DIRECTX INSTALLED», чтобы что-то сделать, например,

    <Control Id="NoManagedDirectX" Type="Text" X="20" Y="50" Width="300" Height="60" Transparent="yes" NoPrefix="yes" Hidden="yes">
      <Text>Microsoft Managed DirectX (MDX) for DirectX 9.0 is NOT installed</Text>
      <Condition Action="show">NOT MANAGED_DIRECTX_INSTALLED</Condition>
    </Control>
    <Control Id="ManagedDirectX" Type="Text" X="20" Y="50" Width="300" Height="60" Transparent="yes" NoPrefix="yes" Hidden="yes">
      <Text>Microsoft Managed DirectX (MDX) for DirectX 9.0 is correctly installed</Text>
      <Condition Action="show">MANAGED_DIRECTX_INSTALLED</Condition>
    </Control>

Неважно, что я делаю, условие всегда ложно (например, не установлено), даже когда я знаю, что файлы там есть. Использование команды msiexec с параметром / l * vx нигде не показывает свойство MANAGED DIRECTX INSTALLED.

Когда используется со следующим, он успешно предотвращает установку (хотя я больше не хочу блокировать установки в этом случае, просто советую).

<Condition Message="You must have Microsoft Managed DirectX (MDX) for DirectX 9.0 installed">
  MANAGED_DIRECTX AND MANAGED_DIRECTX_DIRECTINPUT
</Condition>

Как мне отследить / отладить это (или что я сделал не так?)


РЕДАКТИРОВАТЬ - Теперь я уверен, что мой CustomAction даже не вызывается, если установить следующее значение, ожидаемые результаты тоже не будут!

<CustomAction Id='SetManagedDirectXInstalled'
              Property='MANAGED_DIRECTX_INSTALLED'
              Value='Something hard-coded'/>

или

<CustomAction Id='SetManagedDirectXInstalled'
              Error='Some error should show!'/>

Ответы [ 2 ]

2 голосов
/ 18 июня 2009
  1. Для отладки используйте подробный файл журнала. Он покажет вам состояние ваших свойств по мере их изменения. После этого вы сможете оценить состояние с этими знаниями

  2. Я ответил на этот же вопрос не так давно здесь. Условие, которое использует имя свойства, является тестом на существование. Тест существования для свойства оценивается как true, если свойство вообще имеет какое-либо значение. Если вы хотите проверить значение свойства, вам нужно сделать это явно.

2 голосов
/ 18 июня 2009

Я думаю, что, возможно, нашел ответ, но я не могу попробовать его, пока не буду следующим на моем ПК для разработки.

Похоже, мне нужно сравнить значения со значением ИСТИНА / ЛОЖЬ (или пустой строкой), а не просто ожидать, что оно будет работать как логическое значение ( Источник )

В этих выражениях вы можете использовать имена свойств (помните, что они с учетом регистра). Несуществующая собственность имена будут рассматриваться как пустые строки. Логическая ценность свойство отражает, было ли оно установить - это означает, что вы не можете проверить логическое значение, просто используя Свойство:

  • СОБСТВЕННОСТЬ
    Это будет иметь значение true, если свойство было установлено и имеет какие-либо значение, даже если это значение равно false.
  • НЕ ИМУЩЕСТВО
    Это будет иметь значение true, если свойство не было установлено вообще.
  • ИМУЩЕСТВО = ИСТИНА
  • НЕДВИЖИМОСТЬ = ЛОЖЬ
    Это правильный способ проверить значение логического свойства.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...