Wix: использование KeyPath для компонентов, каталогов, файлов, реестра и т.д. И т.д.

Прочитав этот ответ по принципу "один файл на один компонент" при использовании WiX, мне было любопытно узнать, какие наилучшие практики при использовании атрибута KeyPath на других элементах, включая Component, Directory, Registry и т.д. и т.д.

Меня интересует любое общее предложение, но вот несколько конкретных вопросов:

  • Если у меня есть пустой каталог, который необходимо создать установщику, должен ли я установить KeyPath="yes" на Directory или его родительский Component? Что, если это не пусто?
  • Если файл имеет KeyPath="yes" в сценарии "файл за один компонент", необходимо или целесообразно установить его на свой родительский компонент?
  • Я где-то читал, что вместо установки KeyPath в файле, один должен использовать ключ реестра для каждого файла и установить KeyPath="yes" on Элемент реестра... Это действительно правда/необходимо?

Спасибо!

Изменить # 1 - Разъяснение re: Directory

Я знал, что Directory не имеет KeyPath, но не был явным/подробным в моем вопросе. В основном, мне было интересно узнать об использовании KeyPath для компонента, когда должен быть создан пустой каталог. Я вижу, что KeyPath = "да" в таком случае устанавливается на родительский компонент. Но достаточно ли для установщика обнаружить/восстановить недостающую пустую папку? Или он должен использоваться вместе с регистрационной записью? Пример фрагмента:

<Directory Id="LOGS" Name="Logs">
  <Component Id="LogsDir" Guid="*" KeyPath="yes">
    <CreateFolder Directory="LOGS" />
  </Component>
</Directory>

Ответ 1

В общем, вы должны основывать свое решение на главной идее опции KeyPath. Из MSDN:

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

Итак, если вы создаете 1 файл на один компонент, вы не столкнетесь с ситуацией, когда вы случайно удалили файл, и ремонт не вернул его. Если вы создаете N файлов на один компонент, вы в любом случае либо выберите один из них как KeyPath (и документы WiX рекомендуют вам сделать это явно), либо добавьте дополнительную запись в реестр, и пусть это будет KeyPath.

Вернуться к вашим вопросам:

Если у меня есть пустой каталог, который необходимо создать установщику, должен ли я set KeyPath = "yes" в Каталоге или

Directory элемент не имеет атрибута KeyPath.

Если файл имеет KeyPath = "да" в сценарии "файл за один компонент", необходимо или целесообразно установить его на свой родительский компонент?

Нет, в принципе, это не имеет смысла. Если Component имеет KeyPath="yes", то каталог, в котором этот компонент установлен, становится ключевым путем. Когда вы установите его на File явно, то, очевидно, файл является ключевым путем.

Я где-то читал, что вместо установки KeyPath в файле, нужно используйте ключ реестра для каждого файла и установите KeyPath = "да" в реестре элемент... Это действительно правда/необходимо?

Это звучит как бессмыслица. Опять же, основываясь на общей потребности в KeyPath - обнаружить компонент. Зачем вам нужна дополнительная запись в реестре, чтобы определить, есть ли файл в файловой системе? Это может иметь смысл для N файлов на один компонентный сценарий, когда вы создаете 1 запись в реестре на один компонент (это N файлов) и позволяете установщику Windows судить по этой записи реестра, считается ли компонент "не сломан".

ОБНОВЛЕНИЕ. Вам не нужно вводить запись в реестре только для того, чтобы служить в качестве ключевого пути, чтобы помочь установщику отслеживать пустую папку. Этого достаточно, если вы добавите KeyPath='yes' к родительскому компоненту.

Не усложняйте ситуацию. Установщик Windows довольно сложный, как есть.:) Надеюсь, это поможет.