quarta-feira, 25 de junho de 2008

Controle de Versões e Desenvolvimento Colaborativo no NetBeans 6.x com Subversion – Parte 1

Este tutorial foi dividido em três partes. Na segunda parte, veremos operações com arquivos (código-fonte) tais como, status de alterações, comparação de versões, atualização de copias, comits, entre outros. Na terceira e ultima parte, veremos como instalar, configurar e criar o repositório do SVN, alem de algumas operações para sincronizar arquivos.

Essa primeira parte terá um pouco de teoria necessária para as outras partes.

Uma breve história real

Algum tempo atrás, trabalhando em um projeto pessoal eu controlava minhas "versões" na mão, ou seja, a cada ponto do desenvolvimento em que uma nova implementação rodava aparentemente sem erros, eu copiava, datava e compactava todo o projeto (aqui nesse caso, chamo de projeto um conjunto de pastas e arquivos mantido pelo NetBeans).

Em um dado momento, precisei desfazer uma alteração e me deparei com um problema: não sabia em qual das varias copias estava o ponto ao qual queria voltar, procurei, não encontrei e tive que refazer uma boa parte.

Daí me veio o medo de passar novamente por essa situação. Então fui atrás do Sr. Google e lhe perguntei sobre sistemas de controle de versões. Nas minhas buscas descobri 4 principais controladores de versão: CVS, Subversion, Mercurial e ClearCase.

Falarei sobre o Subversion (também conhecido como svn ou SVN, é open source e foi feito para ser um substituto moderno do CVS, razões da minha escolha), suas funcionalidades juto ao NetBeans 6.x e como esse conjunto poderia ter me poupado um bom trabalho. Falarei também sobre como o SVN permite desenvolvimento colaborativo, já que hoje se fala muito em projetos open source.

Um pouco de teoria sobre Sistemas de Controle de Versão

Mas o que é esse troço e como ele pode me ajudar?
É um software com a finalidade de gerenciar diferentes versões no desenvolvimento de um documento qualquer. É comumente utilizado no desenvolvimento de software para controlar as diferentes versões – histórico e desenvolvimento – dos códigos-fontes e também da documentação.

Funcionamento
SVN utiliza uma arquitetura cliente-servidor (o cliente e o servidor podem estar na mesma máquina): um servidor armazena a(s) versão(ões) atuais do projeto e seu histórico (em banco de dados no caso do SVN), e os clientes se conectam a esse servidor para obter uma cópia completa do projeto, trabalhar nessa cópia e então devolver suas modificações.

Vários clientes podem editar cópias do mesmo projeto de maneira concorrente. Quando eles confirmam suas alterações, o servidor tenta fazer uma fusão delas. Se isso não for possível, por exemplo porque mais de um cliente tentou executar alterações na mesma linha do documento, o servidor apenas executa a primeira alteração e informa ao responsável pela segunda alteração que houve conflito, e que é necessário uma intervenção humana. Se a validação da alteração for bem sucedida, o número de versão de cada cliente arquivo envolvido é incrementado, e o servidor do controlador de versão escreve uma linha de observação (fornecida pelo usuário), a data e o autor das alterações em seus arquivos.

Clientes podem comparar diferentes versões de um arquivo, pedir um histórico completo das alterações, ou baixar uma determinada versão do projeto, ou de uma data específica, não necessariamente a versão mais atual.

Clientes também podem usar um comando (update) para manter suas cópias locais atualizadas com a última versão do servidor. Isso elimina a necessidade de se fazer diversos downloads de todo o projeto.

Um controlador de versão cria pra você (no servidor) um repositório (que nada mais é do que uma pasta, diretório, controlada por ele) onde serão armazenadas todas as alterações feitas por você e/ou pelos desenvolvedores. O NetBeans reconhece automaticamente esta pasta (caso o servidor seja local). Você também pode deixar o repositório do controle de versão no seu pendrive e carregar suas versões pra onde quiser.

Algumas terminologias do Subversion

Checkout: normalmente é usado para denominar o primeiro download de um módulo inteiro a partir do repositório.
Commit: envio das modificações feitas pelo usuário ao repositório.
Export: é o download de um módulo inteiro a partir de um repositório, sem os arquivos administrativos. Módulos exportados não ficam sob controle do SVN.
Import: geralmente é usado para designar a criação de um módulo inteiro dentro de um repositório através do upload de uma estrutura de diretórios.
Module: é uma hierarquia de diretórios. Geralmente um projeto de software existe como um simples módulo dentro do repositório. Um repositório pode conter vários módulos.
Release: é a versão de um produto inteiro.
Revision: é a numeração atribuída pelo SVN a cada modificação de um arquivo.
Tag: é um nome simbólico dado para um conjunto de arquivos em um instante específico durante o desenvolvimento.
Branch: é uma ramificação no desenvolvimento, usada para descrever o processo de divisão dos arquivos de um projeto em linhas de desenvolvimento independentes. Podendo servir para teste de uma nova funcionalidade ou para projetos destinados a um cliente específico.
Update: atualização da cópia local do trabalho através do download das modificações feitas por outros usuários no repositório.
Merge: é a fusão de modificações feitas por diferentes usuários na cópia local de um mesmo arquivo. Sempre que alguém altera o código, é necessário realizar um update antes do commit, de modo que seja feito o merge — ou a fusão — das mudanças.

Termina aqui a primeira parte desse tutorial.
Abraço a todos.

Um comentário:

Ciro disse...

Olá Marcos, o artigo foi bem escrito. Comecei a trabalhar em sistema do qual fiz o checkout(Netbeans 6.5.1 + SVN) e encontrei a pasta \trunk. O que ela significa? Da mesma forma fiquei em dúvida sobre a disposição dos projetos onde alguns fazem referências a outros projetos e não sei como "uni-los". Obrigado.