O que é o atributo 'KeyPath' do wix?

124

O que é o atributo Wix ' KeyPath '? Em particular, como isso se aplica ao seguinte:

<Component Id="ProgramMenuDir" Guid="*">
  <RemoveFolder Id="ProgramMenuDir" On="uninstall" />
  <RegistryValue Root="HKCU" Key="Software\CompName\AppName" 
                 Type="string" Value="" KeyPath="yes" />
</Component>
Seth
fonte
111
OMG, a documentação do Wix é totalmente inútil. O documento wix diz, para o atributo KeyPath, que se você o definir como "Sim", o arquivo será tratado como o caminho da chave do componente. Tãoooo útil !!
Cheeso 16/05
5
@RobMensching - aprecie seu espírito e vontade de contribuir para a comunidade. Dizer-me como NÃO reclamar não é tão bom quanto me dizer (e outros) como reclamar. Se eu soubesse o lugar para criar um bug, há 2 anos, eu teria feito. Além disso, como você pode ver pelos votos positivos, aparentemente outras pessoas se sentem da mesma forma. Talvez esteja na hora desse tipo de mensagem: "Ajude a melhorar o WiX! Por favor, levante os erros apropriados clicando AQUI ".
Cheeso 11/03
21
Vai fazer, @Cheeso! Por favor, registre os bugs aqui: wixtoolset.org/bugs
Rob Mensching
8
@ Chees O conceito-chave a entender é que um projeto de instalação do WiX cria um pacote do Windows Installer. Os documentos do WiX não duplicam (e principalmente não devem) duplicar os documentos do Windows Installer. Embora muitas vezes você possa usar uma construção WiX sem entender as tabelas do Windows Installer suportadas, se houver alguma dúvida, verifique os documentos no MSDN. Para componentes, comece aqui .
Tom Blodget
30
@ TomBlodget: eu diria que o WiX DEVE duplicar os documentos do Windows Installer. Para a maioria dos usuários, a divisão do WiX / Windows Installer apenas causa confusão, e quanto mais puder ser ocultado para o usuário final, mais fácil será usar a ferramenta geral.
Scott Stafford

Respostas:

122

Conforme explicado por Rob Mensching :

O KeyPath para um componente é um recurso único que o Windows Installer usa para determinar se um componente "existe" em uma máquina.

Isso significa que, quando o Windows Installer decide se deseja instalar seu componente, ele primeiro examinará se o recurso do caminho da chave já está presente. Se for, nenhum dos recursos no componente está instalado.

A presença do recurso do caminho-chave também determina se um componente foi danificado ou desapareceu quando você "repara" um MSI.

Quando o recurso do caminho da chave é um arquivo com versão, o Windows Installer considerará que existe apenas se encontrar um arquivo com uma versão igual ou superior.

No seu exemplo específico, você tem um componente que remove uma pasta na desinstalação. Este componente será instalado apenas se a chave de registro fornecida ainda não existir. Adicionar uma chave do Registro para usar como caminho da chave é um truque comum quando você precisa de um caminho-chave para um componente que instala recursos que não podem ser usados ​​como um caminho-chave, como um atalho .

Wim Coenen
fonte
4
Então, qual é o sentido de atribuir explicitamente ao único arquivo em um componente um atributo keypath = "no"?
Christopher B. Adkins
4
@ Adkins: isso suprimiria o comportamento padrão do wix para levar esse arquivo como caminho principal. Como resultado, nenhum caminho-chave é gravado no banco de dados do instalador para esse componente. Durante a instalação, o Windows Installer utilizará a pasta de destino do componente como caminho principal. Outra maneira de obter esse comportamento é definir "keypath = yes" no próprio elemento do componente. De qualquer forma, não me parece uma boa ideia.
Wim Coenen