Wix custom action bininary options


Gostaria de modificar um instalador MSI (criado através do WiX) para excluir um diretório inteiro na desinstalação. Eu entendo as opções RemoveFile e RemoveFolder no WiX, mas estas não são robustas o suficiente para excluir de forma recursiva uma pasta inteira que tenha conteúdo criado após a instalação. Eu notei a pergunta de depósito de pilha semelhante Removendo arquivos ao desinstalar o WiX. Mas eu queria saber se isso poderia ser feito mais simplesmente usando uma chamada para um script em lote para excluir a pasta. Esta é a minha primeira vez usando o WiX, e ainda estou acumulando ações personalizadas. O que seria um exemplo básico de uma ação personalizada que executará um script em lote na desinstalação perguntou Nov 26 08 às 14:41 Este tópico foi uma dor de cabeça por muito tempo. Eu finalmente descobri. Existem algumas soluções on-line, mas nenhuma delas realmente funciona. E, claro, não há documentação. Portanto, no gráfico abaixo, existem várias propriedades que são sugeridas para usar e os valores que eles possuem para vários cenários de instalação. Então, no meu caso, eu queria uma CA que funcionasse somente em desinstalações - não atualizações, nem reparações nem modificações. De acordo com a tabela acima eu tive que usar respondido Apr 8 09 às 20:34 Muito obrigado. Isso realmente me ajudou. Ndash Filip Lindboe 18 de março 10 às 14:59 Os valores desse gráfico estão corretos Por que você precisaria adicionar REMOVEquotALLquot NOT UPGRADINGPRODUCTCODE é apenas verdadeiro para uma desinstalação (de acordo com o gráfico), então (NOT UPGRADINGPRODUCTCODE) E (REMOVEquotALLquot) também Apenas seja verdade em uma desinstalação. O REMOVEquotALLquot parece desnecessário. Ndash Todd Ropog 14 de maio 10 às 19:02 Existem vários problemas com a resposta de yalunas. Também os nomes das propriedades são sensíveis a maiúsculas e minúsculas, Instalado é a ortografia correta (INSTALADO não funcionará). A tabela acima deve ser essa: também assumindo que um completo desinstalador de reparo desinstale os valores reais das propriedades podem ser: nestas expressões, você pode usar nomes de propriedades (lembre-se de que são sensíveis a maiúsculas e minúsculas). As propriedades são documentadas no Guia do Windows Installer (por exemplo, Instalado) EDITAR: pequena correção para o primeiro gráfico - evidentemente, a desinstalação também pode acontecer com apenas REMOVER sendo True. NickWhaley: a opção REMOVER será verdadeira para Upgrades Maiores, ou seja, 1.0.0 a 2.0.0, não 1.0.0 a 1.1.0, durante a execução do desinstalador da versão anterior. Para executar uma ação personalizada durante uma atualização maior nas novas versões de instalação, você precisa fazer referência ao ActionProperty definido na tabela Upgrade MSI para essa atualização de versão. Symantecconnectarticlesmsi-upgrade-overview msdn. microsoften-uslibraryaa37237928vvs.8529.aspx ndash Chaoix Feb 25 15 às 17:46 Você pode fazer isso com uma ação personalizada. Você pode adicionar um refrence à sua ação personalizada sob ltInstallExecuteSequencegt: então você também precisará definir sua ação em ltProductgt: Onde FileCleanerEXE é um binário (no meu caso, um pequeno programa c que faz a ação personalizada), que também está definido em ltProductgt: O verdadeiro truque para isso é a condição instalada e não UPGRADINGPRODUCTCODE na ação personalizada, sem que sua ação seja executada em todas as atualizações (uma vez que uma atualização é realmente uma desinstalação e reinstalar). O que, se você estiver excluindo arquivos, provavelmente não deseja que você queira durante a atualização. Em uma nota secundária: eu recomendo passar pelo problema de usar algo como o programa C para fazer a ação, em vez de um script em lote por causa da potência e controle que ele fornece - e você pode evitar que a janela do prompt do cmd pisque enquanto o instalador corre. Respondeu 26 de novembro 08 às 18:44 25 upvotes mas não uma resposta aceita. Bem-vindo ao mundo dos instaladores. ) Ndash Christopher Painter 12 de fevereiro às 12:15 Isso realmente não funciona. Quando você quer executar um arquivoCleaner. exe, que está instalado em sua própria pasta de instalação, este será um problema de frango e ovo: O CustomAction será executado quotAfter39InstallFinalize39quot. Neste ponto, todos os arquivos são removidos da pasta Instalação. Também o fileCleaner. exe. Então, você não pode executá-lo através de um CustomAction. Esta resposta é simplesmente errada. Eu estou me perguntando sobre as 42 upvotes ndash Simon 7 de abril 16 às 12:33 O maior problema com um script em lote é o processo de reversão quando o usuário clicar em cancelar (ou algo dá errado durante sua instalação). A maneira correta de lidar com esse cenário é criar um CustomAction que adiciona linhas temporárias à tabela RemoveFiles. Dessa forma, o Windows Installer lida com os casos de reversão para você. É insanamente mais simples quando você vê a solução. De qualquer forma, para que uma ação só seja executada durante a desinstalação, adicione um elemento Condicionar com: diz comparar caso insensível (mesmo que eu pense que ALL é sempre uppercaesd). Consulte a documentação MSI SDK sobre a Sintaxe das condições para obter mais informações. PS: Nunca houve um caso em que me sentei e pensei, Oh, o arquivo em lote seria uma boa solução em um pacote de instalação. Na verdade, encontrar um pacote de instalação que tenha um arquivo de lote nele apenas me encorajará a devolver o produto para um reembolso. Adicionando uma ação personalizada Este exemplo mostra como criar uma ação personalizada binária chamada quotFooActionquot. Um exemplo comum é uma ação personalizada dll que lança notepad. exe ou algum outro aplicativo como parte de sua instalação. Antes de começar, você precisará de uma dll de amostra que tenha um ponto de entrada chamado quotFooEntryPointquot. Esta amostra supõe que você já tenha analisado o tópico Criando um Skeleton Extension. Passo 1: Criar um fragmento Você pode referenciar diretamente a ação personalizada no mesmo arquivo de origem que a definição do produto. No entanto, isso não permitirá que a mesma ação personalizada seja usada em outro lugar. Então, ao invés de colocar a definição de ação personalizada no mesmo arquivo de origem, vamos exercer uma pequena modularidade e criar um novo arquivo de origem para definir a ação personalizada chamada quotca. wxsquot. Ok, é isso. Foi feito com a edição do arquivo fonte quotca. wxsquot. Esse pequeno bit de código deve compilar, mas não irá vincular. Lembre-se de ligar exige que você tenha uma seção de entrada. Um ltFragmentgt sozinho não é uma seção de entrada. Vá para o próximo passo para vincular o arquivo de origem. Etapa 2: adicione a ação personalizada. Precisamos vincular este arquivo de origem junto com um arquivo de origem que contenha ltProductgt ou ltModulegt para concluir com êxito. Essas três linhas são tudo o que você precisa adicionar ao arquivo de origem do pacote do Windows Installer para chamar quotFooActionquot CustomAction. Agora que temos dois arquivos para vincular nossa chamada para light. exe fica um pouco mais complicado. Aqui estão as etapas de compilação, link e instalação. Agora, como parte de sua instalação, o que quotFooActionquot deve executar, você deve ver acontecer após a ação InstallFiles. Dicas de Dicas do Wix O Wix é poderoso e eu não recomendaria nenhum outro sistema de compilação de instalação para projetos sérios. Infinitamente personalizável, scriptable, usa arquivos MSI padrão, não custa nada e talvez o melhor de tudo, integra diretamente com o Visual Studio. Tanto o próprio Wix como o sistema MSI são construídos, introduzem uma série de peculiaridades, e a curva de aprendizado é bonita, bastante íngreme. E, em seguida, há aprendendo a mentalidade certa: um arquivo por componente, de preferência adicionado à mão. Heres algumas dicas diversas nada muito avançado, mas vale a pena conhecer o mesmo. Referências de projetos As referências a outros projetos na solução são talvez a única coisa mais importante sobre o uso do Wix, e o que o torna tão bom de usar. Adicionar uma referência é simples: os projetos que você fizer referência serão criados com o instalador e na mesma configuração (debugreleasewhatever) também. Toma cuidado de criar problemas de ordem instantaneamente. E as referências também possuem propriedades Você pode configurar o Wix para coletar arquivos automaticamente que pertençam a um projeto usando HEAT. Pode ser útil se o seu projeto incluir informação COM HEAT é capaz de processar, embora Ive tenha usado principalmente HEAT de etapas de pré-compilação para colher coisas como um diretório cheio de arquivos de documentação. Havent teve muita sorte usando HEAT em auto-registro de servidores. exe nativos, também. Realmente reduz as informações codificadas e está se mexendo com caminhos em relação ao seu instalador. Versão do arquivo de versão do instalador, versão no nome do produto Usando a variável especial (bind. FileVersion.), Você pode configurar seu instalador para ter a mesma versão que um determinado arquivo que ele faz referência. Eu também gosto de acrescentar a versão ao nome do produto, por isso está claro o que está sendo instalado e ter o nome do produto como uma macro que pode ser reutilizada em todo o instalador. Para esclarecimentos, configurei o PRODUCT no código aqui, mas é melhor fazê-lo nas opções do projeto: dessa forma, a macro é global para todos os arquivos no projeto. Adicionando arquivos como links Ao contrário do Visual C, se você adicionar um arquivo existente a um projeto Wix, ele o copia. Adicionar o arquivo como um link é extremamente simples se você não tem o hábito de ignorar as opções adicionais de botão Ok em Diálogos de itens comuns. isso é. Grupos e diretórios de componentes Uma coisa irritante sobre o esquema de Wix é que você não pode ter um grupo de componentes dentro de um elemento DirectoryRef ou vice-versa. Os elementos ComponentGroup e DirectoryRef são críticos para projetos maiores, onde um recurso pode compartilhar grupos de componentes, que por sua vez são definidos em arquivos diferentes. Isso significa que você tende a ver o código, como Observe como o ComponentGroup deve conter um ComponentRef para cada componente em outras palavras, para cada componente adicionado, você deve editar o arquivo em dois lugares, o que é irritante. Felizmente, desde a versão 3, o Wix suporta um atributo Diretório para componentes: muito mais puro. A única desvantagem é que o diretório deve ser repetido para cada Componente. Mas, na prática, não encontro esse problema. Há sempre a função findreplace, afinal. O elemento MajorUpgrade As atualizações, atualizações e patches são uma das partes mais complexas da autoria do MSI. Eu costumo usar apenas as principais atualizações (que desinstale e depois reinstale o produto), pelas seguintes razões: exigem que o GUID do ID do produto seja alterado para cada versão, o que é fácil em Wix ao configurá-lo. Também liberar atualizações menores significa que o ID do produto deve ser atualizado em alguns casos, mas não em outros, o que significa um fluxo de trabalho mais complexo. Eles permitem que os GUIDs gerados automaticamente sejam usados ​​com componentes, o que não só torna menos um aborrecimento para criar arquivos wxs, também significa que a colheita HEAT pode ser feita como um passo pré-compilado que re-runs para cada compilação do instalador. As principais atualizações permitem que todos os componentes de recursos para o instalador sejam reorganizados, facilitando o aprimoramento do instalador enquanto o desenvolvimento avança. Claro, a desvantagem é que você precisa distribuir um grande arquivo MSI mesmo para atualizações simples. O Wix 3.5 introduziu o elemento MajorUpgrade. Que é mais fácil de usar do que mexer com elementos de atualização e atualização atualizados separados. Heres como eu uso isso (observe que PRODUCT é uma macro definida nas opções do projeto): Cuidado: o atributo Id do elemento Product ainda deve ser configurado para Atender também o atributo AllowSameVersionUprades. Os instaladores MSI ignoram o quarto dígito da versão do produto. Por padrão, os instaladores MSI dos quais apenas o quarto dígito da versão são diferentes, serão instalados um ao lado do outro. Isso leva a situações confusas com entradas duplicadas em programas addremove, etc. Ao definir AllowSameVersionUprades como verdadeiro, essas versões serão instaladas uma sobre a outra, como de costume, com o efeito colateral que é possível baixar para versões com um quarto quarto inferior. Para sistemas de versão onde o quarto dígito é, por exemplo, um número de ramo, isso pode ser realmente positivo. Observe que AllowSameVersionUpgradesyes gera um aviso ICE61. Para desativá-lo, adicione-o às validações ICE ignoradas nas propriedades do projeto Wix (em Configurações da ferramenta). É difícil fazer qualquer instalador não trivial sem ignorar pelo menos alguns avisos ICE, especialmente quando módulos de mesclagem de terceiros estão envolvidos. Desativar projetos Wix em compilações Debug Os projetos Wix podem demorar muito para serem construídos, e sempre são realmente necessários. Eu sugiro descarregá-los, ou a pasta da solução (clique direito - Descarregar projetos na pasta de solução) quando eles não são necessários. Eles podem ser completamente desativados no modo de depuração, indo para a caixa de diálogo de configuração da solução e desativando-os para DebugAll Platforms. Wix e Team Foundation Server Team Build Trabalhar com o TFS Team Build pode ser uma dor, e conseguir que ele seja legal com o Wix levou alguma experimentação, mas não é tão difícil: Certifique-se de que os projetos Wix serão criados para a configuração que você deseja usar. Por padrão e irritante, os projetos Wix são construídos apenas para a plataforma de Plataformas Mistas, e não o Win32. Certifique-se de que seus servidores de compilação configurem o uso de plataformas misturadas ou ative os projetos do Wix para o Win32. Certifique-se de que o Wix esteja instalado nos seus sistemas de compilação. Originalmente eu queria evitar ter que fazer isso e segui as etapas descritas aqui. Verificando Wix na árvore de origem. Isso veio com algumas desvantagens principais, porém: ter que editar cada arquivo. wixproj e os binários WixTeam Build não jogam bem quando chegou a hora de limpar:. Registre o Microsoft. Deployment. WindowsInstaller. dll com o GAC, caso contrário o Team Build não conseguirá encontrá-lo, de alguma forma. Inicie um prompt de comando VS2010 como administrador: C: Arquivos de Programas (x86) Windows Installer XML v3.5bingacutil - i Microsoft. Deployment. WindowsInstaller. dll Microsoft (R) Global Assembly Cache Utility. Versão 4.0.30319.1 Direitos autorais (c) Microsoft Corporation. Todos os direitos reservados. Assembléia adicionada com sucesso ao cache Uma desvantagem é que o diretório do arquivo de saída do projeto Wix é ignorado e que seus instaladores serão despejados entre todos os outros binários. Pode ser resolvido usando um passo de pós-construção se você estiver tão inclinado. Proteção UAC no botão Instalar Por padrão, os instaladores Wix pedem privilégios de administrador depois de acertar o botão Instalar em sistemas com UAC habilitado, mas não mostram o escudo UAC no botão. Ao configurar o atributo InstallScope do elemento Package para perMachine. O escudo pode ser feito para aparecer: Infelizmente, parece que, por meio de nenhuma combinação de configurações do InstallScope e do InstallPrivilege, os instaladores podem ser feitos para pedir apenas privilégios de administrador quando esses são realmente necessários, dependendo do diretório de instalação. Como está agora, os instaladores perUser simplesmente falharão quando instalados, por exemplo, no diretório Arquivos de Programas, enquanto os instaladores PerMachine sempre pedem direitos de administrador. TARGETDIR e a partição do sistema Ao tentar instalar em um subdiretório da raiz da unidade do sistema (por exemplo, o aplicativo C:), pode parecer assumir que, em algo como TARGETDIR, se refere à partição do sistema, como ProgramFilesFolder é sempre dado como filho de TARGETDIR . Este não é o caso TARGETDIR é a partição com o espaço livre em disco. Pode até ser uma partição em um disco rígido externo. Para configurá-lo para a partição do sistema verdadeiro, use a abordagem abaixo: O elemento SetDirectory é necessário como tentando usar o WindowsVolume diretamente nos resultados da assinatura de MSIs. Se você assinar seus arquivos MSI, eles obterão um bom prompt profissional do UAC que verifica o pacote como seu . Uma vez que você tenha uma chave de assinatura de código no formato. pfx, assinando um MSI fácil de fazer como uma etapa de pós-compilação do projeto Wix. Certifique-se de passar uma descrição para o pacote, caso contrário, o prompt do UAC mostrará algum nome de arquivo temporário mutilado devido ao funcionamento do msiexec. Por exemplo: Depuração de ações personalizadas Uma maneira fácil de depurar ações personalizadas da dll é que elas gerem uma caixa de mensagem usando a chamada do Windows MessageBox e, em seguida, anexe um depurador. Certifique-se de que a ação personalizada em questão foi criada no modo de depuração se você estiver usando referências de projeto para incluir a dll de ação personalizada, uma compilação de depuração do projeto Wix também incluirá uma versão de depuração da dll. Possa gerar uma caixa de mensagem perto de onde deseja depurar e anexar o depurador Visual Studio. Observe que ao executar uma ação personalizada de 32 bits em uma versão de 64 bits do Windows, uma nova instância do msiexec terá gerado para executar a CA, verifique a caixa Mostrar processos de todos os usuários para encontrá-lo. Uma vez que o depurador tenha anexado, coloque um ponto de interrupção em algum lugar, pressione F5 para continuar, clique em OK na caixa de mensagem e você está no negócio. Criado em: 18 de janeiro de 2012 Modificado: 12 de fevereiro 2012CustomAction Element Descrição do elemento Especifica uma ação personalizada a ser adicionada à tabela MSI CustomAction. Várias combinações dos atributos para este elemento correspondem a diferentes tipos de ação personalizados. Para obter mais informações sobre ações personalizadas, consulte o tópico Tipos de Ação Personalizados no MSDN. O Windows Installer faz referência ao Fragmento dos Pais da Tabela CustomAction. Módulo. Texto interno do produto (xs: string) O nó de texto é válido apenas se o atributo Script for especificado. Nesse caso, o nó de texto contém o script para incorporar. Crianças Nenhum Atributos O identificador da ação personalizada. Esse atributo é uma referência a um elemento binário com atributo Id id. Esse fluxo binário contém a ação personalizada para uso durante a instalação. A ação personalizada não será instalada em um diretório de destino. Esse atributo normalmente é usado com o atributo DllEntry para especificar a DLL de ação personalizada para usar para uma ação personalizada do tipo 1, com o atributo ExeCommand para especificar uma ação personalizada do tipo 17 que executa um executável incorporado ou com os atributos VBScriptCall ou JScriptCall para especificar Um tipo 5 ou 6 ações personalizadas. Este atributo especifica uma referência para um elemento de Diretório com correspondente atributo Id contendo um caminho de diretório. Esse atributo normalmente é usado com o atributo ExeCommand para especificar o executável de origem para uma ação personalizada do tipo 34 ou com o atributo Value para especificar uma seqüência formatada para colocar na entrada da tabela de diretório especificada em uma ação customizada do tipo 35. Este atributo especifica o nome de uma função em uma ação personalizada a ser executada. Este atributo é usado com o atributo BinaryKey para criar uma ação personalizada do tipo 1 ou com o atributo FileKey para criar uma ação personalizada do tipo 17. Esse atributo especifica um índice na tabela Erro MSI para usar como uma mensagem de erro para uma ação personalizada do tipo 19 que exibe a mensagem de erro e interrompe a instalação de um produto. Este atributo especifica os parâmetros da linha de comando para fornecer a um executável executado externamente. Esse atributo normalmente é usado com o atributo BinaryKey para uma ação personalizada do tipo 2, o atributo FileKey para uma ação personalizada do tipo 18, o atributo Property para uma ação personalizada do tipo 50 ou o atributo Directory para uma ação personalizada do tipo 34 que especifica o executável para correr. Este atributo indica o agendamento da ação personalizada. Este valor de atributos deve ser um dos seguintes: commit Indica que a ação personalizada será executada após a conclusão bem-sucedida do script de instalação (no final da instalação). Diferido Indica que a ação personalizada é executada no script (possivelmente com privilégios elevados). FirstSequence Indica que a ação personalizada só será executada na primeira seqüência que o executa. Imediato Indica que a ação personalizada será executada durante o tempo de processamento normal com privilégios de usuário. Este é o padrão. OncePerProcess Indica que a ação personalizada só será executada na primeira seqüência que o executa no mesmo processo. Rollback Indica que uma ação personalizada será executada na seqüência de reversão quando ocorrer uma falha durante a instalação, geralmente para desfazer alterações feitas por uma ação customizada diferida. SecondSequence Indica que uma ação personalizada deve ser executada uma segunda vez se já foi executada anteriormente em uma seqüência anterior. Este atributo especifica uma referência para um elemento Arquivo com o atributo Id correspondente que executará o código de ação personalizado no arquivo após o arquivo ser instalado. Esse atributo normalmente é usado com o atributo ExeCommand para especificar uma ação personalizada de tipo 18 que executa um executável instalado, com o atributo DllEntry para especificar uma DLL de ação personalizada instalada para usar para uma ação personalizada do tipo 17 ou com os atributos VBScriptCall ou JScriptCall para Especifique uma ação personalizada de tipo 21 ou 22.

Comments