Inno Setup (Parte 4): Types, Components e Tasks
Escrito por Carlos B. Feitoza Filho | |
Categoria: Tutoriais | |
Categoria Pai: Addicted 2 Delphi! | |
Acessos: 11160 |
Na parte anterior deste tutorial (Inno Setup (Parte 3): Instalando o PostgreSQL) eu falei a respeito de como incluir os arquivos do PostgreSQL de forma externa numa instalação criada com o Inno Setup, possibilitando sua instalação (cópia) na máquina de destino. Neste momento se nota que existem na verdade duas instalações sendo feitas. Uma é a instalação do programa principal e a outra é a instalação do PostgreSQL. É como se existissem duas instalações dentro de uma só! O Inno Setup permite que se divida uma instalação de forma lógica, separando e nomeando cada sub-instalação e permitindo que o usuário possa decidir exatamente o que quer instalar.
Antes de continuar com a configuração e instalação propriamente dita do PostgreSQL precisamos falar a respeito de Tipos (Types), Componentes (Components) e Tarefas (Tasks).
Tipos (Types)
Como o próprio nome sugere, os Tipos definem os tipos de instalação que podem ser realizadas, muitos instaladores provêm 3 tipos básicos de instalação (completa, mínima e personalizada), no entanto isso não é uma regra e podemos definir quantos tipos quisermos e com os nomes que quisermos! Para nosso exemplo vamos definir 4 tipos de instalação. Para definir um tipo, no TreeView Sections, selecione Types e clique em New Item na barra de ferramentas. A janela Type Properties vai aparecer:
Digite as informações que se pedem para cada um dos tipos que vamos criar. O campo Name é um identificador interno que deve ser único e o campo Description corresponde àquilo que vai aparecer para o usuário durante a instalação. Ao terminar de definir um tipo, clique em OK. Ao terminar de definir todos os nossos 4 tipos, a seção Types do Inno Script Studio vai ficar como na imagem abaixo:
Note que o tipo "Personalizada" possui o flag iscustom. Apenas um tipo de instalação pode ter esse flag definido e seu uso é apenas conceitual, não sendo um tipo de verdade, mas apenas um indicador de que "eu pretendo escolher um conjunto de componentes que não pertencem a nenhum tipo predefinido de instalação". Ao selecionar o tipo "Personalizada", um TreeView será exibido com todos os componentes instaláveis, daí você poderá escolher qualquer combinação que desejar!
Arquivo adicional para demonstração da hierarquização de componentes
A fim de demonstrar a hierarquização dos componentes ao se selecionar o tipo de instalação personalizada, eu resolvi incluir mais um arquivo para o PostgreSQL, trata-se do seu arquivo de manual (postgresql-10-A4.pdf), o qual se encontra anexado ao final deste artigo. Baixe-o e salve-o dentro da pasta "pg", criada em partes anteriores deste tutorial. O conteúdo da pasta pg deve ficar igual ao da imagem abaixo:
Após salvar este arquivo neste local, proceda com a sua adição ao nosso script, para isso, selecione a seção Files e clique em "New Item" na barra de ferramentas. A tela File Properties vai aparecer. Nesta tela, selecione o arquivo PDF que deve estar dentro da pasta pg, e em seguida altere os campos Source e Destination Dir, de forma que eles fiquem exatamente como na imagem abaixo:
Note na tela acima que o flag external foi marcado. Isso é estritamente necessário, já que estamos apenas informando ao Inno Setup onde estão os arquivos do PostgreSQL. Ao pressionar OK para confirmar a adição, a tela de arquivos do Inno Script Studio vai conter o arquivo pdf no final da lista, tal como é visto a seguir:
Após adicionar este arquivo da forma como foi descrita, é hora de voltarmos a nossa programação normal... ;)
Componentes (Components)
Um Componente, dentro do contexto do Inno Setup, é o nome dado a uma "parte" daquilo que existe no instalador, por exemplo, anteriormente eu mencionei que era como se existissem duas instalações dentro de uma, neste caso, seria natural definir dois componentes, um de nome PostgreSQL e outro de nome Programa principal. Todavia os componentes não servem apenas para nomear grandes partes de uma instalação, eles também podem ser usados para subdividir partes preexistentes, pois às vezes podemos querer personalizar ainda mais uma parte de uma instalação. Como exemplo desta subdivisão nós criaremos na verdade 3 componentes para nossa instalação de exemplo. Além dos dois citados anteriormente, haverá mais um para a "Documentação do PostgreSQL", um arquivo PDF de cerca de 15MB.
Para começar clique na seção Components do TreeView Sections, em seguida clique em "New Item". A caixa de diálogo "Component Properties" vai aparecer:
O campo Name é apenas um identificador para o componente. O campo Description é aquilo que vai aparecer para o usuário final durante a instalação caso ele escolha o tipo de instalação personalizada. Clique em OK para confirmar a criação deste componente e repita o procedimento para adicionar o próximo componente (PostgreSQL), o qual possui alguns pormenores que precisam ser explicados:
O componente PostgreSQL será um componente pai na hierarquia de componentes, pois ele terá um filho (Documentação). Por padrão, a relação entre componente pai e componente filho diz que:
1. Um componente filho não pode ser selecionado se seu pai não estiver selecionado
2. Um componente pai não pode ser selecionado se nenhum de seus filhos estiver selecionado
Esta relação entre componentes é perfeita na grande maioria dos casos, no entanto, para o nosso exemplo a assertiva número 2 acima não funciona, pois precisamos permitir que o usuário selecione o componente pai (PostgreSQL) sem selecionar seu único filho (Documentação). A relação padrão entre componentes ligados hierarquicamente segue a regra que diz que a "soma" dos filhos é igual ao pai e por isso, se nenhum filho estiver selecionado, não haverá um pai. No nosso caso, o filho de PostgreSQL é um arquivo opcional e todos os arquivos de instalação do PostgreSQL estarão "contidos" no componente pai PostgreSQL. Como precisamos selecionar o componente pai independentemente de termos componentes filhos selecionados ou não, precisamos definir o flag checkablealone, o qual torna isso possível.
A outra forma de manter o comportamento da hierarquia no padrão (sem necessidade de se utilizar o flag) seria criando dois componentes filhos de PostgreSQL. Um deles seria "Documentação" e o outro seria, por exemplo, "Arquivos principais do PostgreSQL". Dessa forma, com dois componentes filhos, as duas assertivas seriam satisfeitas!
O próximo componente a ser adicionado é o componente filho de PostgreSQL, para isso, na tela Component Properties defina o subcomponente da seguinte forma:
Note agora que o identificador Name, possui uma barra invertida (\) que separa o nome do componente pai (PostgreSQL) do nome do componente filho (Documentacao). Desta maneira nós estamos criando a hierarquia entre PostgreSQL e sua Documentação. O efeito visual disso só será apresentado mais tarde quando testarmos o instalador :) O manual do Inno Setup não cita qualquer limite de quantidades de níveis hierárquicos, mas o uso do bom senso nunca é de mais.
Como foi dito anteriormente, componentes servem para nomear partes daquilo que se pretende instalar, mas o que não foi dito até agora é que os componentes compõem os tipos de instalação! Não faz sentido existir um tipo de instalação se não houver qualquer componente associado a ele. Funciona de forma muito simples: quando o usuário seleciona um determinado tipo de instalação que não seja a instalação personalizada, todos os componentes associados àquele tipo serão instalados automaticamente! Nós criamos 3 componentes e agora precisamos associar cada um deles aos tipos de de instalação adequados. Vamos começar pelo componente "MainProgram". Execute um duplo clique neste componente na lista de componentes para exibir a tela "Component Properties" e vá direto a aba "Types":
Nesta aba nós vemos os tipos de instalação que definimos anteriormente. Para o executável principal de nossa instalação (componente MainProgram) nós selecionamos estes tipos de instalação pois são neles onde o componente precisa ser instalado, ou, no caso do tipo personalizado, aparecer na lista para que o usuário possa selecionar. Normalmente todos os componentes aparecem no tipo definido como completo e no tipo definido como personalizado, por motivos óbvios. Dê OK para confirmar suas alterações, selecione o próximo componente na lista (PostgreSQL) dando duplo clique no mesmo e vá diretamente a aba "Types":
Como eu falei anteriormente, os componentes de uma instalação sempre aparecem nos tipos completo e personalizado. No caso do PostgreSQL, ele obviamente não aparecerá no tipo MinimaEXE, que é exclusivo do programa principal, mas vai aparecer no tipo "MinimaPG", que é exclusivo do PostgreSQL. Clique em OK para confirmar as alterações para este componente e faça exatamente o mesmo para o componente "PostgreSQL\Documentacao". Como este componente é filho de "PostgreSQL" é natural que ele figure nos mesmos tipos de instalação que seu pai. Não seguir esta lógica é um tanto quanto bizarro, mas o Inno Setup permitiria sem problemas.
Ao terminar de alterar os 3 componentes, a tela de componentes vai estar como na imagem abaixo:
Na coluna Types se encontram os tipos de instalação aos quais cada componente pertence e isso é tudo que precisa ser feito para definir os componentes. Posteriormente neste artigo será mostrado como utilizar os componentes.
Tarefas (Tasks)
Tarefas são, grosso modo, flags gerais que habilitam ou não a realização de determinadas operações pelo instalador. Estas operações incluem basicamente qualquer coisa feita pelo instalador, incluindo a cópia de arquivos ou mesmo a execução de código escrito em Pascal Script! Basicamente, tudo que realiza de alguma forma alterações no computador de destino pode ser controlado com tarefas.
Ao executarmos o Wizard inicial no Inno Script Studio (Inno Setup (Parte 2): Criando o projeto básico) para criação do instalador básico, nós escolhemos em determinado momento que gostaríamos de permitir que o usuário escolhesse se gostaria ou não que ícones na sua área de trabalho e na barra "Quick Launch" (Disponível no Windows XP) fossem criados:
Ao escolhermos estas duas opções no Wizard, o Inno Script Studio criou entradas nas seções Tasks e Icons do nosso script. Na seção Tasks foram criadas as tarefas propriamente ditas:
A coluna Name é o identificador da tarefa e tal como os identificadores de componentes eles podem ser hierarquizados usando-se barras invertidas (\). Não vou falar a respeito desse uso, se quiser experimente por conta própria criar uma tarefa pai e uma tarefa filha. As 3 colunas seguintes merecem explicações adicionais. A coluna Description define aquilo que vai ser exibido para o usuário durante a instalação. A coluna Group Description define a descrição de um grupo ao qual aquela tarefa pertence. Essa descrição aparece acima das tarefas que pertencem a este mesmo grupo. A coluna Flags indica, como se pode observar, que, por padrão, estas tarefas estarão desmarcadas. Note que as colunas Description e Group Description contém valores especiais, na verdade estes valores são constantes de idioma e permitem a internacionalização de sua instalação, assunto que não será aprofundado neste tutorial, mas, a fim de não deixar lacunas faltantes nesta explicação, por exemplo, {cm:CreateDesktopIcon} diz:
Neste ponto inclua a mensagem correspondente a custom message (cm) de identificador CreateDesktopIcon. Esta mensagem será selecionada a partir da tabela de mensagens do idioma selecionado no início da instalação e pode ser alterada na seção Custom Messages.
As outras constantes apresentadas ({cm:CreateQuickLaunchIcon} e {cm:AdditionalIcons}) seguem exatamente a mesma lógica e nada impede que você substitua estas constantes por textos simples, mas vamos deixar elas como estão, pois servirão para que você comprove a mudança de idioma caso você escolha um idioma diferente ao executar o instalador.
Apesar de o Wizard ter criado estas duas tarefas, ele não é capaz de fazer todo o trabalho necessário porque ele não tinha como associar cada tarefa a um componente. Na verdade ele não pôde fazer isso porque ainda não existiam componentes e agora que nós os cariamos, precisamos associar estas tarefas aos componentes corretos. Execute um duplo clique em cada uma das tarefas apresentadas e em seguida clique na aba Components:
Como ambas as tarefas dizem respeito ao ícone do programa principal, é natural que tenhamos escolhido como componente apenas MainProgram, já que não faz sentido que existam tais ícones se o programa principal não for instalado.
Vamos criar agora como exemplo mais uma tarefa, a qual será usada posteriormente no tutorial. Trata-se de uma tarefa que, caso o usuário opte por sua execução, configurará o PostgreSQL. Clique na seção Tasks do Treeview Sections em seguida clique em New Item, na barra de ferramentas. A caixa de diálogo Task Properties vai aparecer:
Configure os campos como se vê acima para que a tarefa "Configurar o PostgreSQL" fique disponível para o usuário durante a instalação abaixo do grupo de nome "PostgreSQL" na página de tarefas adicionais do instalador. Esta tarefa, por padrão, estará marcada para ser executada. Não pressione ainda o botão OK, precisamos associar nossa tarefa a um componente, portanto, clique na aba Components:
Nesse caso, a tarefa de configurar o PostgreSQL só fará sentido caso o PostgreSQL tenha sido escolhido para ser instalado, logo, apenas o componente "PostgreSQL" precisa ficar marcado. Não é necessário marcar "PostgreSQL\Documentacao" visto que este componente diz respeito apenas a documentação do PostgreSQL e não aos arquivos dele, os quais sim, podem ou não ser configurados.
Ao finalizar, a tela de Tarefas conterá 3 tarefas, duas criadas automaticamente pelo Wizard do Inno Script Studio e uma criada por nós para permitir a configuração ou não do PostgreSQL:
Note que a tarefa que criamos não possui o flag unchecked e isso é natural, já que queremos, por padrão, que a configuração do PostgreSQL seja feita. O usuário neste caso poderá optar pela não configuração do PostgreSQL. Esta tarefa só será de fato referenciada e utilizada posteriormente neste tutorial e servirá inicialmente para que o PostgreSQL seja configurado por meio do Pascal Script.
Para terminar, vou explicar como as tarefas que o Wizard criou (as duas primeiras) foram utilizadas, de forma que você possa criar e utilizar outras tarefas simples. As duas tarefas dizem respeito a criação de ícones, logo, se clicarmos na seção Icons do Tree View Sections, veremos o seguinte:
OBS.: Eu adicionei a coluna "Tasks" para que eu não precisasse criar mais uma imagem apenas para mostrar a tarefa associada ao ícone. Se você não estiver vendo a coluna "Tasks", execute um duplo clique num dos dois itens destacados e vá até a aba "Tasks" para ver a tarefa associada ou adicione a coluna "Tasks" a lista. Fica como tarefa de casa descobrir como fazer isso ;)
Cada item nessa lista cria os ícones especificados de forma incondicional, mas como se pode ver, os dois últimos estão, cada um deles, associados a uma tarefa. O primeiro está associado a tarefa "desktopicon" e o segundo está associado a tarefa "quicklaunchicon". Durante a execução do instalador, cada tarefa vai apresentar um checkbox, portanto, o ícone associado àquela tarefa só será criado caso o checkbox correspondente esteja marcado. Itens que não possuem tarefas associadas são sempre criados.
Associando icones a Componentes
O Wizard do Inno Script Studio criou cinco itens na seção Icons, como pode ser visto na imagem anterior, mas nesse momento ainda não tínhamos criado nossos Componentes de instalação e por isso os itens de ícones foram criados sem fazer qualquer referência a componentes e isso é errado!
De forma geral (isso serve para a maioria das seções) todos os itens são processados (isto é, instalados ou copiados para a máquina de destino) a não ser que haja algo que altere este comportamento. No caso, todos os cinco ícones só fazem sentido caso estejamos instalando o programa principal, logo, faz-se necessário alterar todos os cinco itens de criação de ícones de forma a associá-los ao componente adequado. Para fazer isso, selecione todos os itens na lista, clique com o botão direito em qualquer um deles e clique na opção Item Properties:
Ao fazer isso, a tela Icon Properies vai aparecer e você notará que a maioria dos campos estará vazia. Isso acontece porque você selecionou mais de um item e está editando propriedades para todos os itens selecionados. Campos em branco possuem valores diferentes entre os itens e campos preenchidos possuem valores iguais. Não altere nenhum campo e vá até a aba Components:
Nesta aba, selecione o componente MainProgram apenas e clique OK para confirmar, dessa forma apenas a propriedade "Components" será alterada para todos os itens (ícones) selecionados:
Como se pode observar, a seleção múltipla de componentes permite alterar propriedades específicas, replicando-as para todos os itens selecionados! Sobre o componente escolhido (MainProgram), é absolutamente correto que, se todos os ícones dizem respeito ao programa principal eles só devem ser processados caso estejamos instalando o programa principal, o qual faz parte do componente "MainProgram".
Associando arquivos a Componentes
Tal como fizemos com os ícones, precisamos associar os arquivos que se serão instalados a componentes adequados, de forma que ao selecionar componentes durante a instalação, apenas arquivos correspondentes àquele componente sejam copiados para a máquina de destino. Para fazer isso vá a seção Files do Tree View Sections:
Note que a coluna Components (destacada de vermelho) não mostra qualquer componente, o que é normal, visto que nós ainda não associamos os componentes a nenhum arquivo. Nesta lista de arquivos existem 3 grupos de arquivos e cada um deles será associado a um componente distinto. O primeiro grupo de arquivos contém apenas um arquivo (o primeiro arquivo da lista), que é o programa principal, o qual deve ser associado ao componente "MainProgram". Execute um duplo clique em cima deste arquivo na lista e, na tela "File Properties" vá até a aba "Components" e selecione o componente "MainProgram", tal como é visto abaixo:
Pressione OK para confirmar a associação e em seguida selecione o segundo grupo de arquivos. Tal como o primeiro grupo, o segundo contém apenas um arquivo (postgresql-10-A4.pdf), o qual é o último da lista e corresponde ao PDF de documentação do PostgreSQL, execute um duplo clique neste arquivo e, na tela "File Properties" vá até a aba "Components" e selecione o componente "PostgreSQL\Documentacao", tal como é visto abaixo:
Pressione OK para confirmar a associação e em seguida selecione o último grupo de arquivos. O último grupo de arquivos contém os arquivos exclusivos da instalação do PostgreSQL, portanto, selecione todos os arquivos que fazem parte do PostgreSQL com cuidado para não selecionar nem o primeiro arquivo, que pertence ao componente "MainProgram" e nem o último, que pertence ao componente "PostgreSQL\Documentacao" e em seguida, clique com o botão direito em qualquer um dos arquivos selecionados e selecione o item de menu "Item Properties" para exibir a tela "File Properties", vá diretamente a aba "Componentes" e selecione o componente "PostgreSQL", tal como é visto abaixo:
Clique em OK para confirmar as alterações e dentro de alguns segundos a tela do Inno Script Studio vai refletir as alterações mostrando na coluna Components os componentes aos quais cada arquivo pertence. Veja abaixo como tela deve ficar:
Novamente eu devo repetir que ao associar um arquivo a um componente, aquele arquivo só será transferido para a máquina de destino, caso aquele componente tenha sido selecionado durante a instalação pelo usuário que está instalando.
Associando outros elementos a componentes
O Wizard do Inno Script Studio perguntou em determinado momento se gostaríamos de oferecer a opção de execução do executável principal tão logo a instalação termine. Ao selecionarmos sim para essa opção, foi inserido um item na seção Install Run, o qual faz com que apareça ao final da instalação um checkbox que permite que o usuário escolha se deseja iniciar o programa principal.
Tal como aconteceu com ícones e arquivos, precisamos associar este item da seção Install Run ao componente adequado que é obviamente MainProgram. Execute esta alteração dando duplo clique no item que aparece na tela da seção Install Run. O procedimento é exatamente o mesmo que foi feito para arquivos e ícones, por isso não vou dar mais detalhes. Você já deve ter entendido não é? Realize este mesmo procedimento para todo e qualquer item que possua uma propriedade "Components".
Testando a nossa instalação
Finalmente chegou a hora de testarmos nossa instalação, mas antes de compilarmos o instalador, precisamos fazer um pequeno ajuste nas suas configurações. Para isso, com o projeto aberto, vá ao menu Project > Setup Options > Installation Pages e desmarque a opção "Show Components List", tal como é visto abaixo:
Esta opção faz com que o TreeView de componentes somente apareça caso selecionemos o tipo "Personaliza" durante a instalação. Se essa opção ficar marcada, o TreeView aparecerá sempre e eu não acho isso tão legal :). Após desmarcar a opção, pressione OK para confirmar, salve o projeto, compile-o e em seguida execute-o. A instalação vai transcorrer como de costume mas você vai notar a existência de uma nova página:
A página "Selecionar Componentes" permite que você selecione o tipo de instalação desejada. O ComboBox mostra inicialmente o primeiro tipo de instalação que criamos, mas, como se pode ver abaixo ele também permite selecionar todos os tipos que criamos:
Quando você seleciona um tipo de instalação, os componentes que pertencem a este tipo serão automaticamente selecionados nos bastidores. Se você selecionar o tipo "Personalizada (Você decide o que instalar)" o TreeView com os componentes instaláveis aparecerá:
Agora você pode selecionar qualquer combinação de componentes para instalar. Como nossa instalação é muito simples, não sobram muitas opções que justifiquem o uso de uma instalação customizada, mas, no caso da imagem acima, por exemplo, selecionamos a instalação APENAS do PostgreSQL mas não de sua documentação. Fiz isso intencionalmente para demonstrar o efeito do flag chackablealone, o qual foi aplicado ao componente "PostgreSQL", caso este flag estivesse desativado eu não seria capaz de selecionar apenas o item "SGDB PostgreSQL", pois o item "Documentação (PDF)" seria automaticamente selecionado por "fazer parte" de "SGDB PostgreSQL" sendo filho dele. Pressione o botão Avançar até chegar na página "Selecionar Tarefas Adicionais":
O que esta tela mostra depende dos componentes que foram selecionados anteriormente. Como eu mantive a opção de instalar apenas o PostgreSQL, esta tela vai apresentar apenas tarefas relacionadas a instalação do PostgreSQL. No caso, será apresentada a única tarefa relacionada ao componente "PostgreSQL". Se você quiser, volte até a tela de seleção de componentes e escolha outros componentes ou tipos de instalação e verifique esta tela novamente para comprovar que ela muda, mostrando tarefas de acordo com os componentes a serem instalados.
Conclua a instalação e, caso você tenha escolhido apenas instalar o PostgreSQL, notará que no local escolhido para instalação haverá apenas a pasta pg, com todo seu conteúdo e nada mais, a não ser os arquivos acessórios do Inno Setup:
Caso você não tenha muita fé, execute o instalador novamente e utilize outros tipos de instalação e componentes e verifique o que acontece ;)
O que vem a seguir?
Na próxima parte deste tutorial eu pretendo começar a falar a respeito da configuração do PostgreSQL e possivelmente começar a falar do Pascal Script. Espero vocês lá! :)