WiX: прервать установку, если конкретный исполняемый файл отсутствует в PATH - PullRequest
1 голос
/ 06 февраля 2012

В настоящее время я упаковываю программное обеспечение с WiX, для работы которого требуется Java.Поэтому я хотел бы во время установки проверить, находится ли java.exe где-то в PATH, и отменить, если его не удалось найти.Решение в http://sourceforge.net/mailarchive/message.php?msg_id=23451655 близко соответствует моим потребностям, но вместо поиска в реестре я хотел бы найти зависимость в каталогах в переменной PATH.

Это легковозможно с WiX?Если нет, возможно ли установить значение свойства на основе возвращаемого значения настраиваемого действия.Затем я мог бы написать пакетный скрипт, который ищет Java и соответственно устанавливает свойство для <Condition>.

Ответы [ 2 ]

4 голосов
/ 06 февраля 2012

Я бы написал немедленное настраиваемое действие, которое будет выполнять следующее:

  • захват значения переменной среды PATH.Вы можете использовать синтаксис [%PATH]
  • , проанализировав его, разделив на ;, выполнив итерацию и найдя нужный каталог
  • проверьте, существует ли каталог и присутствует ли java.exe там
  • установить для свойства JAVA_IS_INSTALLED значение 1, если оно есть, в противном случае вообще не устанавливать.Это можно сделать как session["JAVA_IS_INSTALLED"] = 1 с DTF (инфраструктура, поставляемая с набором инструментов WiX)
  • добавить элемент <Condition> со свойством JAVA_IS_INSTALLED

ПРИМЕЧАНИЕ.быть запланированным до действия LaunchConditions и должен находиться в обеих последовательностях (InstallUISequence и InstallExecuteSequence)

2 голосов
/ 08 февраля 2012

Основываясь на ответе Яна, я реализовал эту функцию так:

Мой источник WiX содержит:

<Binary Id="B.CustomActionsScript" SourceFile="CustomActions.js" />
<CustomAction
    Id="CA.runJava"
    BinaryKey="B.CustomActionsScript"
    JScriptCall="runJava"
    Execute="immediate"
    Return="check" />

<Condition Message="The Java Runtime Environment is not installed.">
  Installed OR JAVA_IS_INSTALLED
</Condition>

<InstallUISequence>
  <Custom Action="CA.runJava" Before="LaunchConditions">NOT Installed</Custom>
</InstallUISequence>

<InstallExecuteSequence>
  <Custom Action="CA.runJava" Before="LaunchConditions">NOT Installed</Custom>
</InstallExecuteSequence>

И CustomActions.js содержит эту функцию:

function runJava() {
  try {
    var shell = new ActiveXObject("WScript.Shell");
    shell.Run("java -version", 0, true);

    Session.Property("JAVA_IS_INSTALLED") = "1";
  } catch (ex) {
  }
  return 1;
}

Вместо поиска java.exe в PATH я проверяю, установлена ​​ли Java, пытаясь ее выполнить. Если Java не может быть выполнена, Exec выдает исключение и JAVA_IS_INSTALLED никогда не устанавливается.

...