Como alguém lidaria com dependências externas em um projeto de código aberto?


23

Quando alguém escreve um projeto de código aberto e usa o Google Code ou GitHub e deseja usar uma biblioteca como Lua, como fazer isso?

  • A dependência deve ser incluída no repositório?
  • A dependência deve ser criada a partir do mesmo script de compilação que o resto do projeto ou de um script de compilação separado?

Dado que a biblioteca não precisa de instalação antes da compilação.

Respostas:


10

Eu recomendo a leitura da documentação do Git sobre submódulos ; Ele resolve esse problema, assumindo que todas as suas fontes usem o Git. Caso contrário, você sempre pode configurar um repositório Git para fins de integração. O esforço é trivial e a recompensa é significativa.


1
Sub-módulos é uma implementação bastante fraca do gerenciamento de dependências em comum e no Git. Pelo menos git subárvore é muito melhor iteração
preguiçoso Badger

4
-1 Inclua detalhes do link em sua resposta, caso contrário, a resposta será inútil quando o link desaparecer - como é o caso agora. Infelizmente, eu não tenho o representante para
votar

@Prastic: Se você pesquisar no google o texto do link, ele será direcionado diretamente para a nova página; Não tenho certeza de quanto mais informativo isso pode ser.
Bryan Agee

1
Leia stackoverflow.com/help/how-to-answer - especificamente a seção "Fornecer contexto para links" (citação: "Cite sempre a parte mais relevante de um link importante, caso o site de destino esteja inacessível ou permaneça offline permanentemente . ")
Precastic

17

A dependência deve ser incluída no repositório?

Eu acho que as dependências sempre devem ser incluídas no repositório, desde que incluí-las não viole nenhum termo de uso. Poucas coisas são mais irritantes do que ter que encontrar as versões corretas das dependências corretas manualmente antes de poder fazer uma compilação. Claro, isso é fácil quando você tem ferramentas automatizadas para fazer isso por você, que podem encontrar e baixar a dependência certa, mas e se você não estiver conectado à Web no momento ou se o servidor estiver inoperante ou o projeto da dependência foi descontinuado completamente e colocado offline? Sempre inclua as dependências, se possível.

A dependência deve ser criada a partir do mesmo script de compilação que o resto do projeto ou de um script de compilação separado?

A menos que haja um bom motivo para compilar a partir do código-fonte, use versões pré-compiladas.

E por que não fornecer opções no script de construção? Uma opção simples para escolher se as dependências também devem ser compiladas ou não. Se o usuário optar por compilar as dependências também, basta chamar seus próprios scripts de construção a partir do script de construção do seu produto. Assim, o usuário pode chamar os scripts de construção das dependências manualmente ou optar por criar uma construção completa de tudo. Mas eu entregaria as dependências como binários, se não houver um bom motivo para compilá-las a partir das fontes. Acho que no mundo do código aberto, algumas licenças exigem que você distribua as fontes junto com o seu produto, mas isso não significa que você não pode tê-las pré-compiladas.

Em resumo: forneça todo um pacote de trabalho independente, se possível. Isso proporcionará a maior comodidade aos seus usuários.


1
@ Tdammers: Eu sei, se você está instalando software em um sistema Linux, o gerenciador de pacotes faz todo o trabalho para você. Mas isso requer uma conexão com a Internet e o pacote deve estar em um determinado formato e expliquei explicitamente que as ferramentas de automação podem ajudar com isso. Você não pode usar esse sistema para ferramentas de código-fonte aberto do .NET, por exemplo. Se você der uma olhada nas ferramentas do sourceforge como NHibernate ou Castle Windsor, verá que todas as dependências são incluídas como binários. E essa é a única coisa razoável a fazer.
Falcon

1
@ tdammers: Por coincidência, tenho que instalar o OpenOffice SDK em uma máquina Linux aqui hoje. Como o SDK não pode ser instalado via gerenciador de pacotes, peguei o RPM no site. Qual você acha que é a primeira mensagem que recebo ao tentar executar o "rpm --install"? erro: Dependências com falha: ooobasis3.3-core01 é necessário pelo ooobasis3.3-sdk-3.3.0-9567.x86_64 - OH JOY!
Falcon,

2
@ Tdammers: você está certo, mas no caso, eu adoraria ter essa redundância se apenas a instalação e a instalação fossem fáceis. E quando você quiser ver um inferno de dependência, dê uma olhada no diretório / usr / lib. Há tudo: redundância, subversões e você nem sabe qual programa usa quais bibliotecas. Claro, deixe o gerente de pacotes lidar com isso! Mas e se o gerenciador de pacotes não puder lidar com isso como no caso de escritório aberto que mencionei. Isso basicamente significa que você está ferrado e será difícil instalar algo.
Falcon,

2
@ tdammers: E quanto mais eu penso sobre isso e minhas experiências: não consigo nem contar os tempos em que criei links simbólicos neste diretório apenas porque as dependências falharam ou algum programa se recusou a executar, mesmo quando instalado através de um gerenciador de pacotes. Talvez a situação tenha melhorado agora, mas muitas vezes ainda é apenas um trabalho árduo fazer algumas coisas funcionarem. Problemas que poderiam ter sido evitados se eles tivessem enviado a dependência com o aplicativo. De bom grado pagarei os poucos MB de espaço adicional apenas para evitar esse aborrecimento.
Falcon,

2
@ Tdammers: Os inúmeros tutoriais na Web sobre como instalar um programa específico em um sistema Linux específico são testemunhas desse problema.
Falcon,

3

Isso pode ou não se aplicar ao seu caso de uso, mas o que fazemos no trabalho é incluir uma pasta "Referências" em cada ramificação. Colocamos DLLs de terceiros aqui. Isso causa muita duplicação de binários relativamente imutáveis ​​no controle de origem, mas o armazenamento é barato e a qualquer momento cada ramo e tag possui exatamente as dependências (e versão!) Que espera.

Nós pré-compilamos as dependências e movemos os binários compilados para essa pasta. Nossa própria biblioteca compartilhada interna também é tratada dessa maneira. Dessa forma, a mesma técnica funciona para bibliotecas proprietárias pré-compiladas, bibliotecas de código aberto e bibliotecas internas.


No que diz respeito a responder à sua pergunta agora que a reli, faça o mesmo e mencione apenas que o seu projeto usa uma versão 1.3.5 pré-compilada do Lua.


1

A dependência deve ser incluída no repositório?

Ele pode ser referenciado no repositório (por qualquer método utilizável para SCM), se essa dependência for parte integrante do produto (dependência da origem), não dependência binária, que pode ser resolvida separadamente

A dependência deve ser criada a partir do mesmo script de compilação que o resto do projeto ou de um script de compilação separado?

Não importa nada. Você pode preferir qualquer método, de acordo com seus requisitos (velocidade / transparência / capacidade de gerenciamento / etc)


0

Sendo uma loja Eclipse, começamos a usar o Buckminster para gerenciar nosso processo de compilação / montagem / implantação.

Nosso primeiro estágio foi retirar todas as nossas bibliotecas dependentes existentes e permitir que o buckminster cuide de materializar as corretas. Isso contribui para uma implantação muito mais rápida e menor.

O próximo passo será mover nosso svnrepositório monolítico para uma série de gitrepositórios modulares .

Não sei até que ponto o buckminster se integrava aos gitsubmódulos (ou subrepos mercuriais), mas é bom que o buckminster seja independente do VCS usado para qualquer componente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.