Inno Setup (Parte 3): Instalando o PostgreSQL
Escrito por Carlos B. Feitoza Filho | |
Categoria: Tutoriais | |
Categoria Pai: Addicted 2 Delphi! | |
Acessos: 10392 |
Nesta parte do tutorial estaremos começando a abordar o assunto que foi o meu maior motivador ao querer escrever sobre o Inno Setup: a instalação e configuração do PostgreSQL.
Quando eu escrevi o artigo Instalação e configuração manual do PostgreSQL no Windows, a primeira coisa que pensei foi que aquele esquema manual de instalação poderia ser automatizado, daí lembrei do excelente Inno Setup e notei que ainda não havia falado dele e de sua (pouco conhecida) capacidade de permitir a inclusão de páginas customizadas.
Imaginei que seria excelente mostrar para a comunidade de programadores que é possível personalizar o Inno Setup a ponto de disponibilizar aos usuários uma tela integrada ao instalador com a qual se pode configurar uma instância do PostgreSQL! Nesta parte ainda não falaremos a respeito de como criar esta tela personalizada, mas, como tudo nessa vida, tudo tem um começo e a gente tem que começar pelo básico :)
Preparando o ambiente
Na parte anterior deste tutorial eu solicitei que fosse criada uma pasta de nome "pg" dentro da pasta que contém as pastas "instalador" e "aplicação". Se você não fez isso ainda, é um péssimo aluno. Também me considero um péssimo professor, porque eu disse que não ia mais tocar neste assunto e cá estou eu falando a respeito. Enfim, faça isso, cria a pasta pg e extraia dentro dela o conteúdo do zip que contém o PostgreSQL de forma que ao final a estrutura de pastas fique assim:
Não, eu não errei a imagem, como se pode observar, você não vai precisar de todas as pastas do PostgreSQL, apenas estas que você está vendo na imagem acima: bin, lib e share. Duas pastas adicionais, data e log, serão criadas pelo instalador no sistema onde ele estiver sendo executado, portanto, apenas estas 3 pastas serão utilizadas pelo instalador.
Eu recomendo que você dê uma olhada no artigo Instalação e configuração manual do PostgreSQL no Windows para entender o que estaremos fazendo nesta parte do tutorial. Será bem interessante notar que todos os passos mostrados no artigo estão sendo realizados de forma automatizada pelo Inno Setup ;) Após a execução do instalador, a estrutura de pastas do PostgreSQL instalado será exatamente aquela mostrada no artigo, ou seja:
Incluindo os arquivos do PostgreSQL no projeto
Após realizar os procedimentos apresentados na seção anterior nós poderemos incluir os arquivos e pastas do PostgreSQL no nosso projeto. Para começar, abra o nosso script de trabalho no Inno Script Studio e clique em Files no TreeView do lado esquerdo da tela para acessar o manipulador de arquivos. Nesta tela você verá apenas um arquivo, que é o arquivo principal da nossa instalação. Este arquivo, na verdade um executável, foi incluído pelo wizard da parte 2 desse tutorial.
Para incluir os arquivos do PostgreSQL, primeiramente clique no ícone Add Folder e selecione a pasta do PostgreSQL (pg) da nossa estrutura de pastas.
Após a seleção da pasta pg, a caixa de diálogo Add Folder vai aparecer. Nesta caixa de diálogo, marque a opção External e clique em OK. Deixe as demais configurações exatamente como estão na imagem acima.
A opção External instrui o Inno Setup a não incluir os arquivos dentro do instalador. Apesar de isso ser perfeitamente possível eu prefiro ter um executável de instalação de tamanho aceitável. Caso eu optasse por incluir os arquivos no instalador finalizado, o executável do mesmo teria mais de 50MB, pois ele conteria todos os arquivos compactados. Eu recomendo então que em instalações com muitos arquivos e/ou arquivos grandes, estes arquivos sejam apenas referenciados externamente de forma a não inchar o executável do instalador.
Após incluir os arquivos do PostgreSQL, a tela do gerenciador de arquivos do Inno Script Studio vai ser populada com todos os arquivos abaixo da pasta pg como esperado.
Na imagem acima, merece menção um detalhe: na coluna Source Folder é possível observar que os caminhos dos arquivos que acabaram de ser adicionados contém {src}, ao contrário do caminho para o executável (primeira linha). Isso é absolutamente normal. A coluna Source Folder tem dois significados; quando o arquivo em questão não tem o flag External, esta coluna mostra o local do arquivo que será incluído no executável final de instalação. Por outro lado, quando o arquivo possui este flag, a coluna mostra o local na mídia de distribuição onde o arquivo estará disponível, já que ele não está compactado dentro do executável do instalador.
Com isso em mente, a constante especial {src} significa o local a partir do qual o instalador está sendo executado, por exemplo, considerando o primeiro arquivo do PostgreSQL (clusterdb.exe), o Source Folder dele é {src}\pg\bin, logo, seu caminho completo seria {src}\pg\bin\clusterdb.exe. Considerando que estejamos executando o instalador localizado em E:\instalador\install.exe, ao fazer a substituição da constante, o arquivo clusterdb.exe precisa estar localizado em E:\instalador\pg\bin para que o nosso instalador o encontre e possa copiá-lo para a máquina onde está sendo feita a instalação.
Portanto, ao distribuir nosso instalador, na mesma pasta onde seu executável estiver, deverá haver uma subpasta de nome pg, com toda a estrutura que já foi menciona anteriormente de forma que o instalador possa encontrar os arquivos e realizar a instalação corretamente. Na nossa estrutura de pastas, a pasta pg não se encontra no diretório de saída do instalador compilado (OutputDir no script), mas não se preocupe. Vou utilizar passos de pós-compilação para copiar os arquivos dentro dessa pasta ;)
Outra coluna que eu gostaria de falar a respeito, é a coluna Destination Folder. Esta coluna mostra o local padrão onde o arquivo em questão será instalado o qual contém outra constante especial {app}. Esta constante será substituída pelo local selecionado pelo usuário durante a instalação.
Na imagem acima, note que para o primeiro arquivo da lista (InstaladoPeloInnoSetup.exe) Destination Folder é simplesmente {app}, porque é ela a pasta escolhida pelo usuário durante a instalação. Para os arquivos do PostgreSQL, note que será criada uma subpasta de nome "pg" abaixo da pasta {app} e é exatamente onde eu queria chegar, por isso vou destacar bastante o que vou falar.
No artigo onde eu falei a respeito da instalação manual tanto do MySQL quanto do próprio PostgreSQL eu fui veemente em dizer que não se deve instalar o banco de dados dentro do diretório da aplicação no entanto, a fim de tornar esse tutorial mais simples eu peço uma "licença poética" para instalar o banco de dados no diretório da aplicação ({app}\pg). Se eu resolvesse não fazer isso eu deveria informar um caminho estático ou pedir que o usuário informasse um caminho. A opção de usar um caminho estático (c:\pg, por exemplo) é ruim por motivos óbvios. Já a opção de solicitar ao usuário um diretório para instalação do PostgreSQL, iria tornar o desenvolvimento da tela de instalação customizada mais complexo (mais um campo para manipular). Basicamente é preguiça minha mesmo não querer fazer isso, portanto, para deixar bem claro EM INSTALADORES REAIS PROCURE NÃO INSTALAR NADA EM LOCAIS FIXOS E NUNCA INSTALE BANCOS DE DADOS NA MESMA PASTA DA INSTALAÇÃO DO PROGRAMA SENDO INSTALADO
Neste ponto, o instalador que estamos construindo já conhece todos os arquivos do PostgreSQL que ele precisará instalar, no entanto algo foi feito automaticamente e não deveria ter sido feito: ao incluir os arquivos do PostgreSQL usando o método que eu expliquei acima, o Inno Script Studio cria automaticamente entradas para cada uma das pastas do PostgreSQL na seção Directories. Apesar de isso não não causar problema algum eu recomendo que todas as pastas que foram incluídas automaticamente na seção Directories sejam excluídas. Para isso, clique em Directories no Tree View e no gerenciador de pastas, selecione todos os itens (pastas) pressionando CTRL+A e pressione DEL.
O motivo de eu não gostar desses diretórios é que a própria ajuda do Inno Setup diz que a seção Directories foi primariamente desenvolvida para permitir que diretórios vazios sejam criados na máquina onde se está instalando. Se você precisa que algum diretório exista mesmo que vazio antes de executar algum programa que você estiver instalando, você pode incluir este diretório na seção Directories, mas no nosso caso, não será necessário criar os diretórios dos arquivos do PostgreSQL porque ao instalar um destes arquivos o Inno Setup já cria automaticamente seus diretórios, tornando todos aqueles diretórios da seção Directories inúteis e inchando o nosso script. Resumindo: após adicionar os arquivos do PostgreSQL, remova todos os diretórios existentes na seção Directories.
Etapas de pré e pós-compilação
Após adicionar os arquivos do PostgreSQL precisamos copiá-los da nossa estrutura de pastas, para a pasta de saída do nosso instalador compilado (instalador\bin), mas não faremos isso manualmente.
O script do Inno Setup possui duas seções especiais que apenas o Inno Script Studio interpreta chamadas Post Compilation Steps (etapas pós-compilação) e Pre Compilation Steps (etapas de pré-compilação). Nestas duas seções especiais podemos incluir comandos que serão executados, respectivamente, após compilar o instalador e antes de compilar o instalador.
Usaremos estas etapas de pré e pós-compilação para excluir a pasta pg da pasta de saída do instalador (instalador\bin) e copiar novamente os arquivos a partir da pasta pg da nossa estrutura de pastas. Primeiramente crie um arquivo de lote de nome DeletePG.bat e o salve na mesma pasta onde nosso script (ZOISE.iss) se encontra, em seguida abra este arquivo em um editor de texto como o notepad e digite a seguinte linha dentro dele, a qual vai excluir a pasta insalador\bin\pg:
rmdir /q /s .\bin\pg
Em segundo lugar crie um arquivo de lote de nome CopyPG.bat e o salve na mesma pasta onde o nosso script (ZOISE.iss) se encontra, depois abra este arquivo em um editor de texto como o notepad e digite a seguinte linha dentro dele:
xcopy.exe ..\pg\*.* ..\instalador\bin\pg /E /I
O comando acima vai copiar de forma recursiva, tudo que estiver dentro da pasta pg da nossa estrutura de pastas dentro da pasta pg localizada na pasta de saída do instalador compilado (instalador\bin\pg).
Agora que os arquivos foram criados, precisamos incluí-los nas seções adequadas. A forma de adicionar ambos os arquivos é exatamente igual, o que muda é apenas em qual etapa estaremos incluindo determinado arquivo. Para incluir o arquivo DeletePG.bat na etapa de pré-compilação, clique no item Pre Compilation Steps no TreeView e em seguida clique no botão "New Item":
Após clicar o botão, a tela Pre-Compile Action vai aparecer. Nesta tela, no campo Filename, digite simplesmente o nome do arquivo de lote a ser adicionado (DeletePG.bat), não altere qualquer outra opção e clique OK para confirmar. Os passos para adicionar o arquivo CopyPG.bat na seção Post Compilation Steps são exatamente os mesmos que foram usados acima.
É claro que nós poderíamos ter incluído a pasta pg diretamente na pasta instalador\bin e não ter que fazer nenhuma cópia de arquivos, acontece que minha intenção com esses passos aparentemente desnecessários é a de instruir vocês a respeito das etapas de de pré e pós-compilação. Usando estas etapas você poderia até mesmo comprimir os arquivos do PostgreSQL e copiar o arquivo compactado (.rar, por exemplo) utilizando duas etapas de pós-compilação, mas é claro que isso implicaria em termos de modificar nosso script para executar a descompactação antes de realizar a instalação, me obrigando a falar a respeito da seção Install Run do script do Inno Setup, mas eu não vou falar a respeito de Install Run neste tutorial. Após ele terminar, sinta-se à vontade pesquisar por conta própria a respeito ou me pergunte através dos comentários no final do artigo.
Compilando o script
Se você realizou todos os passos da seção anterior corretamente, é hora de realizar uma nova compilação do nosso script. Como agora temos uma etapa de pré-compilação, esta será executada antes da compilação propriamente dita começar, no entanto o ato de apagar a pasta pg é tão rápido que provavelmente você só verá uma janela de comando piscar na tela. Após isso a compilação terá início e quando ela terminar, a etapa de pós-compilação será executada. Desta vez, o ato de copiar todos os arquivos da nossa estrutura de pastas para a pasta de saída do instalador compilado vai demorar um pouco mais, por isso você certamente verá uma janela de comando que mostrará a cópia dos arquivos sendo feita. Quando a cópia terminar você verá a pasta de saída do instador tal como na figura abaixo:
Esta é a pasta de saída do instalador compilado (instalador\bin). No nosso script ela é identificada pela propriedade OutputDir, a qual foi configurada quando executamos nosso assistente para geração do script básico. Se você fosse construir uma mídia de instalação, seria o conteúdo desta pasta que você deveria incluir nesta mídia, mantendo a estrutura de pastas e arquivos dentro dela inalterada, de forma que o instalador ache cada um de seus recursos externos.
Se você ainda não compilou o script, faça isso agora pressionando CTRL+F9 e veja com seus próprios olhos aquilo que eu expliquei anteriormente, em seguida execute o instalador (F9) e conclua a instalação para comprovar que a pasta pg é criada no diretório de destino da instalação!
A imagem acima mostra o resultado da instalação em minha máquina. Eu optei por usar o diretório padrão (C:\Arquivos de Programas (x86)\ZOISE), mas poderia ter sido qualquer outro. Note que o instalador criou corretamente a pasta pg, além, claro, do programa principal (InstaladoPeloInnoSetup.exe) e do desinstalador (unins000.exe), o qual pode ser usado para desinstalar tudo que foi instalado. O Inno Setup também cria uma entrada no Painel de Controle, de forma que possamos desinstalar usando a tela Programas e Recursos.
O que vem a seguir
Após instalar mais uma vez usando nosso instalador talvez você tenha se perguntado "E se eu não quiser instalar o PostgreSQL, como faço?". Ou ainda, "E se eu quiser instalar apenas o PosgreSQL, tem como?". A resposta para estas e outras perguntas estará no próximo artigo desta série. Vejo vocês lá!