A experiência conquistada com dificuldade me ensinou que quase tudo pertence ao controle de origem. (Meus comentários aqui são coloridos por uma década e meia em desenvolvimento para sistemas embarcados / telecomunicações em hardware proprietário com ferramentas proprietárias e, às vezes, difíceis de encontrar.)
Algumas das respostas aqui dizem "não coloque binários no controle de origem". Isto é errado. Ao trabalhar em um produto com muitos códigos de terceiros e muitas bibliotecas binárias de fornecedores, você faz check-in nas bibliotecas binárias . Porque, se não o fizer, em algum momento você atualizará e terá problemas: a compilação é interrompida porque a máquina de compilação não possui a versão mais recente; alguém fornece ao novo cara os CDs antigos para instalar; o wiki do projeto possui instruções antigas sobre qual versão instalar; Pior ainda, se você precisar trabalhar em estreita colaboração com o fornecedor para resolver um problema específico e ele enviar cinco conjuntos de bibliotecas em uma semana, você deverápoder rastrear qual conjunto de binários exibiu qual comportamento. O sistema de controle de origem é uma ferramenta que resolve exatamente esse problema.
Algumas das respostas aqui dizem "não coloque a cadeia de ferramentas no controle de origem". Não vou dizer que está errado, mas é melhor colocar a cadeia de ferramentas no controle de origem, a menos que você tenha um sistema de gerenciamento de configuração sólida (CM) . Mais uma vez, considere o problema de atualização conforme mencionado acima. Pior ainda, trabalhei em um projeto em que havia quatro tipos diferentes de ferramentas flutuando quando fui contratado - todos eles em uso ativo ! Uma das primeiras coisas que fiz (depois que consegui fazer uma compilação funcionar) foi colocar a cadeia de ferramentas sob controle de origem. (A idéia de um sistema sólido de CM estava além da esperança.)
E o que acontece quando projetos diferentes exigem cadeias de ferramentas diferentes? Caso em questão: Após alguns anos, um dos projetos recebeu uma atualização de um fornecedor e todos os Makefiles foram interrompidos. Acontece que eles estavam contando com uma versão mais recente do GNU make. Então, todos nós atualizamos. Opa, os Makefiles de outro projeto quebraram. Lição: confirme as duas versões do GNU make e execute a versão que acompanha o checkout do seu projeto.
Ou, se você trabalha em um lugar onde todo o resto está descontroladamente descontrolado, você tem conversas como: "Ei, o cara novo está começando hoje, onde está o CD do compilador?" "Não sei, não os vejo desde que Jack saiu, ele era o guardião dos CDs." "Uhh, não foi isso antes de sairmos do 2º andar?" "Talvez eles estejam em uma caixa ou algo assim." E como as ferramentas têm três anos, não há esperança de obter esse CD antigo do fornecedor.
Todos os seus scripts de construção pertencem ao controle de origem. Tudo! Todo o caminho até as variáveis de ambiente. Sua máquina de compilação deve poder executar uma compilação de qualquer um dos seus projetos executando um único script na raiz do projeto. ( ./build
é um padrão razoável; ./configure; make
é quase tão bom.) O script deve configurar o ambiente conforme necessário e, em seguida, iniciar qualquer ferramenta que construa o produto (marca, formiga etc.).
Se você acha que é muito trabalho, não é. Na verdade, economiza uma tonelada de trabalho. Você confirma os arquivos uma vez no início dos tempos e sempre que atualizar. Nenhum lobo solitário pode atualizar sua própria máquina e confirmar um monte de código-fonte que depende da versão mais recente de alguma ferramenta, quebrando a compilação para todos os outros. Quando você contrata novos desenvolvedores, pode pedir para eles verificarem o projeto e executarem ./build
. Quando a versão 1.8 possui muitos ajustes de desempenho e você ajusta o código, os sinalizadores do compilador e as variáveis de ambiente, você deseja garantir que os novos sinalizadores do compilador não sejam acidentalmente aplicados às compilações de patches da versão 1.7, porque eles realmente precisam do código mudanças que os acompanham ou você vê algumas condições de corrida peludas.
O melhor de tudo é que isso vai te salvar um dia: imagine que você envia a versão 3.0.2 do seu produto na segunda-feira. Viva, comemore. Na terça-feira de manhã, um cliente VIP liga para a linha direta de suporte, reclamando sobre esse bug supercrítico e urgente na versão 2.2.6 que você enviou há 18 meses . E você ainda precisa contratá-lo, e eles se recusam a atualizar até que você possa confirmar com certeza que o bug foi corrigido no novo código e que eles são grandes o suficiente para fazer você dançar. Existem dois universos paralelos:
No universo em que você não tem bibliotecas, cadeia de ferramentas e scripts de construção no controle de origem, e você não possui um sistema CM sólido ... Você pode verificar a versão correta do código, mas ela fornece você todos os tipos de erros ao tentar criar. Vamos ver, atualizamos as ferramentas em maio? Não, essas eram as bibliotecas. Ok, volte para as bibliotecas antigas - espere, houve duas atualizações? Ah sim, isso parece um pouco melhor. Mas agora esse estranho acidente de vinculador parece familiar. Ah, é porque as bibliotecas antigas não funcionaram com a nova cadeia de ferramentas, é por isso que tivemos que atualizar, certo? (Vou poupar a agonia do resto do esforço. Leva duas semanas e ninguém fica feliz no final, nem você, nem a gerência, nem o cliente.)
No universo em que tudo está no controle de origem, você confere a tag 2.2.6, tem uma compilação de depuração pronta em mais ou menos uma hora, passa um dia ou dois recriando o "bug VIP", localiza a causa, corrige-a a versão atual e convencer o cliente a atualizar. Estressante, mas não tão ruim quanto o outro universo em que sua linha do cabelo é 3 cm mais alta.
Com isso dito, você pode ir longe demais:
- Você deve ter uma instalação padrão do SO da qual tenha uma "cópia dourada" de. Documente-o, provavelmente em um README que esteja no controle de origem, para que as gerações futuras saibam que a versão 2.2.6 e anterior foram criadas apenas no RHEL 5.3 e 2.3.0 e posterior, apenas no Ubuntu 11.04. Se for mais fácil gerenciar o conjunto de ferramentas dessa maneira, siga em frente, apenas certifique-se de que é um sistema confiável.
- É difícil manter a documentação do projeto em um sistema de controle de origem. Os documentos do projeto estão sempre à frente do próprio código, e não é incomum trabalhar na documentação da próxima versão enquanto trabalha no código da versão atual. Especialmente se todos os documentos do seu projeto forem documentos binários que você não pode diferenciar ou mesclar.
- Se você possui um sistema que controla as versões de tudo usado na compilação, use-o ! Apenas verifique se é fácil sincronizar com toda a equipe, para que todos (incluindo a máquina de compilação) estejam utilizando o mesmo conjunto de ferramentas. (Estou pensando em sistemas como o pbuilder do Debian e o uso responsável do virtualenv do python.)