Como gerenciar corretamente dependências para o projeto C / C ++?


11

Eu tenho um projeto que usa 3-4 diferentes bibliotecas C / C ++ de código aberto.

Criei essas bibliotecas para várias plataformas e registrei arquivos e bibliotecas estáticas para diferentes plataformas no meu projeto.

No entanto, luto com alguns problemas. Todos esses projetos estão relacionados ao gerenciamento de dependências. E estou procurando conselhos de melhores práticas.

1) Como sei exatamente o que uso?

Não tenho como obter uma versão de uma biblioteca estática. Como resultado, preciso rastrear qual versão da lib estática estou usando (pode ser SHA de uma confirmação a partir da qual ela foi criada)?

Isso é especialmente importante quando preciso descobrir quando atualizar essas bibliotecas.

2) Como reproduzo a compilação?

Eu poderia ter lutado para criar alguma biblioteca específica para uma plataforma específica. Demorei um pouco para descobrir.

A próxima vez em que precisarei criar a mesma biblioteca poderá ser em meio ano (quando precisarei atualizar por qualquer motivo. No entanto, nessa época, não vou me lembrar de nada e de um ambiente no qual ela foi construída. já se foi há muito tempo.

3) Devo bifurcar essas bibliotecas para ter uma cópia do código fonte?

Esta é uma preocupação menor. No entanto, ainda é uma preocupação. É bom garantir que as compilações sejam reproduzíveis (e isso requer código-fonte).

Respostas:


5

Você realmente precisa sempre usar uma versão exata de uma biblioteca dependente? Está mal escrito / quebra sua API com cada aumento menor na versão?

Se você observar projetos de código-fonte aberto, os configurescripts de compilação ( principalmente na parte) verificam se várias bibliotecas estão presentes e, se não estiverem , geram um erro. Também é flexível o suficiente para permitir que o usuário se vincule a uma versão mais recente da biblioteca (que provavelmente fornece mais correções de bugs / segurança do que uma versão anterior) e também não impõe vinculação estática ou dinâmica.

Se você realmente precisa de construções reproduzíveis, deve prestar atenção à versão exata do compilador e de suas bibliotecas padrão, talvez até do sistema operacional. Nesse caso, ter uma máquina de compilação com o ambiente exato que você precisa é, na minha opinião, melhor do que verificar as bibliotecas compiladas no repositório de código-fonte.


2
Eu não acho que preciso usar a versão exata. No entanto, preciso saber qual deles estou usando. Como exemplo, se encontra alguém que OpenSSL 1.1.0b tem um enorme vulnerabiity, é melhor eu saber se eu uso 1.1.0b OpenSSL ou 1.1.0c
Victor Ronin

Em relação à reprodutibilidade de uma compilação, essa é provavelmente a minha preocupação secundária.
Victor Ronin

3

Como sei o que exatamente uso?

Se os arquivos de inclusão ou libs ainda não contêm um número de versão, adicione um arquivo de texto "version.txt" (contendo o número da versão) a cada pasta lib e verifique-o no seu VCS, juntamente com os arquivos lib e include . No entanto, se você versão da fonte completa da lib (ponto 3), as chances são altas, já existe um arquivo de código fonte contendo o número da versão, portanto, não há necessidade de manter a sua própria para este caso.

Como reproduzo a compilação?

Tente automatizar o máximo que puder. Use scripts, makefiles ou arquivos de suas ferramentas de construção favoritas. Coloque tudo isso sob controle de origem. Se houver etapas manuais necessárias, anote os detalhes em um arquivo de texto (por exemplo, readme_build.txt) e coloque-o sob controle de origem.

Devo bifurcar essas bibliotecas para ter uma cópia do código-fonte?

Você deve ter uma cópia do código-fonte , mas faça uma bifurcação apenas se necessário (por exemplo, se você tropeçar em um bug urgente e o autor original não puder corrigi-lo dentro das restrições de tempo). Ou, se os autores usarem um ambiente de compilador diferente do seu e for necessário fazer algumas alterações para que a lib funcione em seu ambiente. No entanto, esteja ciente de que cada alteração no código-fonte original no seu fork provavelmente dificulta a integração de atualizações posteriormente.

No entanto, eu recomendo obter uma cópia do código fonte original (não desbloqueado) das bibliotecas que você está usando. Isso permitirá que você bifurque ou mantenha a lib posteriormente, se necessário, mesmo que o mantenedor original decida revogar as fontes da lib da Web pública.


Então, a resposta é "faça isso manualmente" :) Eu esperava que alguém dissesse ... ah ... existe uma ferramenta para isso :) Quando você diz "cópia do código fonte", quer dizer, é só pegar um tar arquivo com a fonte e despejá-lo no controle de origem?
Victor Ronin

1
@VictorRonin: não, a resposta é "deixe seu VCS lidar com tudo o que pode fazer por você" e "automatize o máximo possível usando as ferramentas de compilação padrão". Você é quem escolhe uma versão específica e precisa definir as etapas de construção, vincular e incluir referências para o seu ambiente. O procedimento padrão para manifestar essas despendências é através de scripts, makefile, arquivos de projeto etc.
Doc Brown

... e como você obtém a lib ou o código-fonte das bibliotecas depende de como o mantenedor / fornecedor a fornece. Talvez uma bola de alcatrão, talvez pelo acesso direto ao git hub, talvez um pacote de pepitas.
Doc Brown
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.