Что такое атрибут "KeyPath" в wix?

125

Что такое атрибут Wix KeyPath ? В частности, как это применимо к следующему:

<Component Id="ProgramMenuDir" Guid="*">
  <RemoveFolder Id="ProgramMenuDir" On="uninstall" />
  <RegistryValue Root="HKCU" Key="Software\CompName\AppName" 
                 Type="string" Value="" KeyPath="yes" />
</Component>
Сет
источник
112
Боже мой, документация Wix совершенно бесполезна. В документе wix для атрибута KeyPath указано, что если вы установите для него значение «Да», то файл будет рассматриваться как ключевой путь для компонента. Оооочень полезно !!
Cheeso
5
@RobMensching - цените свой дух и готовность внести свой вклад в сообщество. Сказать мне, как НЕ жаловаться, не так хорошо, как сказать мне (и другим), как Жаловаться. Если бы я знал, где можно поднять ошибку, 2 года назад, я бы это сделал. Кроме того, как вы можете видеть по голосам "за", очевидно, что другие люди чувствуют то же самое. Может быть, пришло время для такого сообщения: «Помогите улучшить WiX! Пожалуйста, сообщите о соответствующих ошибках, нажав ЗДЕСЬ ».
Cheeso
21
Подойдет, @Cheeso! Сообщайте об
Роб Меншинг
8
@Cheeso Ключевое понятие, которое необходимо понять, заключается в том, что проект установки WiX создает пакет установщика Windows. Документы WiX не дублируют (и в большинстве случаев не должны) дублировать документы установщика Windows. Хотя вы часто можете использовать конструкцию WiX, не разбираясь в таблицах установщика Windows, которые она поддерживает, если есть какие-либо вопросы, вы должны проверить документацию на MSDN. Что касается компонентов, начните здесь .
Tom Blodget
30
@TomBlodget: Я бы сказал, что WiX СЛЕДУЕТ дублировать документы установщика Windows. Для большинства пользователей разделение WiX / Windows Installer просто вызывает путаницу, и чем больше того, что может быть скрыто от конечного пользователя, тем проще использовать инструмент в целом.
Скотт Стаффорд

Ответы:

122

Как объяснил Роб Меншинг :

KeyPath для компонента - это единственный ресурс, который установщик Windows использует, чтобы определить, «существует» ли компонент на машине.

Это означает, что когда установщик Windows решает, устанавливать ли ваш компонент, он сначала проверяет, присутствует ли уже ресурс keypath. Если это так, ни один из ресурсов в компоненте не установлен.

Наличие ресурса keypath также определяет, был ли компонент поврежден или пропал без вести при «ремонте» MSI.

Если ресурс keypath является версионным файлом, установщик Windows будет считать его существующим, только если найдет файл с такой же или более поздней версией.

В вашем конкретном примере у вас есть компонент, который удаляет папку при удалении. Этот компонент будет установлен только в том случае, если данный раздел реестра еще не существует. Добавление раздела реестра для использования в качестве пути к ключу - распространенный прием, когда вам нужен путь к ключу для компонента, который устанавливает ресурсы, которые сами по себе не могут использоваться в качестве пути к ключу, например ярлык .

Вим Коенен
источник
4
Тогда какой смысл явно указывать единственному файлу в компоненте атрибут keypath = "no"?
Кристофер Б. Адкинс
4
@Adkins: это подавит поведение wix по умолчанию, чтобы использовать этот файл в качестве ключевого пути. В результате в базу данных установщика не записывается путь ключа для этого компонента. Затем во время установки установщик Windows будет использовать папку назначения компонента в качестве ключевого пути. Другой способ добиться такого поведения - установить «keypath = yes» в самом элементе компонента. В любом случае, мне это не кажется хорошей идеей.
Wim Coenen