WIX условие запуска CustomAction в MergeModule
От: Acteon  
Дата: 16.12.08 15:32
Оценка:
Добрый день.

Второй день бьюсь, может кто поможет.

Вообщем, есть Merge Module содержащий некий драйвер устройства. Он должен скопировать этот драйвер и запустить его установку, что и делается в CustomAction InstallSmartCardReaderDriver.
Есть еще инсталятор который включает в себя этот Merge Module в одну из Feature, и она может не быть выбрана для установки. И когда это происходит Component DPInstx86.exe не устанавливается, а CustomAction InstallSmartCardReaderDriver все равно выполняется. Естественно происходит ошибка.

Собственно вопрос, как проверить был ли установлен Component перед выполнением CustomAction?

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Module Id="MMSmartCardReaderDriver" Language="1033" Version="0.2.0.0">
    <Package Id="c9e4ff95-5854-4a7f-99af-53d9f06afd0d" Manufacturer="MMSmartCardReaderDriver" InstallerVersion="200" />
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="MergeRedirectFolder" Name="MergeRedirectFolder">
        <Directory Id="CardReader" Name="CardReader">
        </Directory>
      </Directory>
    </Directory>
    <DirectoryRef Id="CardReader">
      <Component Id="DPInstx86.exe" Guid="{64CFDA68-3B16-485F-8C0F-274EE0E4B568}">
        <File Id="DPInstx86.exe" Name="DPInstx86.exe" KeyPath="yes" Source="..\..\..\SharedBinaries\Drivers\CardReader\DPInstx86.exe"/>
      </Component>
    </DirectoryRef>
    <CustomAction Id="InstallSmartCardReaderDriver" FileKey="DPInstx86.exe" Execute="commit" ExeCommand="" Return="ignore"/>
      <InstallExecuteSequence>
        <Custom Action='InstallSmartCardReaderDriver' After='InstallFiles'/>
      </InstallExecuteSequence>
  </Module>
</Wix>
Re: WIX условие запуска CustomAction в MergeModule
От: WPooh США  
Дата: 16.12.08 19:12
Оценка:
Здравствуйте, Acteon, Вы писали:

A>Второй день бьюсь, может кто поможет.

Пример из WiX Tutorial. Но вообще, не бейтесь так долго. Спрашивайте раньше.
MSDN не сильно блещет по этим вопросам, там надо разбираться подольше, но оно там есть. Но поковыряться придется.
Так что спрашивайте, не побьют.

A>Собственно вопрос, как проверить был ли установлен Component перед выполнением CustomAction?

Я вырезал все несущественное и оставил только нужное.
Собственно, ссылка на компонент и условие на то, что компонент устанавливается ($ComponentID = 2). Описание синтаксиса тут. На всякий случай, условие на удаление $ComponentID = 3.

ComponentID и condition выделил полужирным курсивом.

      <Component Id="DPInstx86.exe" Guid="{64CFDA68-3B16-485F-8C0F-274EE0E4B568}">
        <File Id="DPInstx86.exe" Name="DPInstx86.exe" KeyPath="yes" Source="..\..\..\SharedBinaries\Drivers\CardReader\DPInstx86.exe"/>
      </Component>

    <CustomAction Id="InstallSmartCardReaderDriver" FileKey="DPInstx86.exe" Execute="commit" ExeCommand="" Return="ignore"/>
      <InstallExecuteSequence>
        <Custom Action='InstallSmartCardReaderDriver' After='InstallFiles'>$DPInstx86.exe = 2</Custom>
      </InstallExecuteSequence>


Успехов!
К этому моменту у меня внутри 0.5, 0.7, 0.33 (с) НС
Re[2]: WIX условие запуска CustomAction в MergeModule
От: Acteon  
Дата: 17.12.08 11:03
Оценка:
Здравствуйте, WPooh, Вы писали:

WP>Собственно, ссылка на компонент и условие на то, что компонент устанавливается ($ComponentID = 2). Описание синтаксиса тут. На всякий случай, условие на удаление $ComponentID = 3.


WP>ComponentID и condition выделил полужирным курсивом.


WP>
WP>      <Component Id="DPInstx86.exe" Guid="{64CFDA68-3B16-485F-8C0F-274EE0E4B568}">
WP>        <File Id="DPInstx86.exe" Name="DPInstx86.exe" KeyPath="yes" Source="..\..\..\SharedBinaries\Drivers\CardReader\DPInstx86.exe"/>
WP>      </Component>

WP>    <CustomAction Id="InstallSmartCardReaderDriver" FileKey="DPInstx86.exe" Execute="commit" ExeCommand="" Return="ignore"/>
WP>      <InstallExecuteSequence>
WP>        <Custom Action='InstallSmartCardReaderDriver' After='InstallFiles'>$DPInstx86.exe = 2</Custom>
WP>      </InstallExecuteSequence>
WP>


WP>Успехов!


Спасибо за быстрый ответ. Туториалы и хелп я читал, и пробовал уже подобный вариант, не помню правда что я там ставил (толи ?, толи &), а что обозначает каждая цифра я до сих пор смутно представляю.
Ваш вариант к сожалению не сработал, но придал мне уверенности, и опытным путем я выяснил, что работает при условии $DPInstx86.exe = 3. В всязи с этим, если не сложно, не могли бы вы расписать, что значит каждая цифра?
Re[3]: WIX условие запуска CustomAction в MergeModule
От: WPooh США  
Дата: 17.12.08 22:17
Оценка:
Здравствуйте, Acteon, Вы писали:

A>Спасибо за быстрый ответ. Туториалы и хелп я читал, и пробовал уже подобный вариант, не помню правда что я там ставил (толи ?, толи &), а что обозначает каждая цифра я до сих пор смутно представляю.

A>Ваш вариант к сожалению не сработал, но придал мне уверенности, и опытным путем я выяснил, что работает при условии $DPInstx86.exe = 3. В всязи с этим, если не сложно, не могли бы вы расписать, что значит каждая цифра?
Позор на мою голову! Вот что значит длительное отсутствие практики. Конечно, я все перепутал. 3 — инсталяция, 2 — деинсталяция.

Я кидал ссылку на статью в MSDN. Маленько разъясню, что там написано.
Для большинства простых случаев, имеет смысл два значения: 2 и 3.
Они означают разные случаи, в зависимости от символа перед идентификатором ($ или ? для компонента, & или ! для фичи).
$ для компонента и & для фичи значат какое действие будет выполняться — установка (3) или удаление (2).
$ComponentID = 3 — установка компонента.
$ComponentID = 2 — удаление компонента.

? для компонента и ! для фичи значат какое состояние имеет компонент или фича — установлен (3) или нет (тут сложнее и зависит от многих моментов, для простоты, <>3)
?ComponentID = 3 — компонент уже установлен
?ComponentID <> 3 — компонент не установлен

Аналогично, &FeatureID — действие над фичей в текущей сессии инсталяции. !FeatureID — состояние фичи перед текущей сессией инсталяции.

Есть ряд тонких моментов, связанных с переустановкой пакета. Тип действия для фичи и компонента будет тем же, что и при первоначальной установке. То есть, как будто просто устанавливаем. Если есть необходимость обрабатывать случай переустановки отдельно, то нужно условия составлять с использованием текущего состояния компонента или фичи (? или !). Например, если нужно запускать Custom Action только на установку, но не в случае repair/reinstall, то примерно так: $ComponentID = 3 And ?ComponentID <> 3. Можно $ComponentID = 3 And ?ComponentID = 2, но есть сценарии переустановки, когда вместо Run From Source клиент выбирает Run Local. Сходу не помню точно, но для feature условия несколько другие — Windows Installer ставит состояние фичи при repair/reinstall в "Reinstall", а такого значения нет в том списке значений enum'а, которые задокументированы и он мапится в INSTALLSTATE_UNKNOWN (-1). Это, видимо, баг, но фиксить его, к сожалению, уже неразумно — часть инсталяшек уже знают это поведение.
Мое резюме такое — если вам не нужно отлавливать repair/reinstall — не усложняйте себе жизнь и используйте простые условия. Если же надо использовать предыдущее состояние компонента или фичи — проверьте все случаи, в том числе repair/reinstall. Не забываем при этом случай update через reinstall, если делаете этот вариант возможным. Но это уже для второй и следуюшей версий продукта.

ЗЫ. Это только на первый взгляд, установка Windows Installer'ом — простая вещь. В сложных случаях вылезают куча острых подводных камней. Самое сложное — upgrade. Тут можно долго и много писать. На отдельную книжку точно хватит. Но это не значит, что Windows Installer не нужно использовать. Для простых инсталяшек он очень даже хорош, интегрируется с разными службами и пр. фенечки.
Чего-то меня уже понесло... Раз пять брался статью писать, но до конца дело не довел.

Успехов!
К этому моменту у меня внутри 0.5, 0.7, 0.33 (с) НС
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.