É inevitável que no desenvolvimento do projeto seja necessário integrar bibliotecas de terceiros. Reinventar a roda não faz sentido quando já existe uma variedade imensa de bibliotecas que auxiliam a vida do desenvolvedor.

Fazer a integração arrastando manualmente o código fonte para o projeto não é uma opção muito viável na maioria dos casos. Trazer a responsabilidade de manutenção do código para o lado do desenvolvedor pode ser uma estratégia não tão favorável. Então, para facilitar esse processo, existem os gerenciadores de dependência. Vamos abordar alguns a seguir para facilitar a vida de um desenvolvedor iOS.

Cocoa Pods

CocoaPods é um gerenciador de dependência para projetos Swift e Objective-C. Possui mais de 81 mil bibliotecas e é utilizado em mais de 3 milhões de aplicativos. Ele é desenvolvido com Ruby e pode ser instalado com o Ruby padrão disponível no macOS.

Ele é muito fácil de configurar com o Podfile e tem muitas bibliotecas e plug-ins. A curva de aprendizado é baixa para qualquer nível de desenvolvedor de aplicativos ou frameworks. É interessante dizer que ele é centralizado, as dependências são armazenadas em um repositório central e fica mais fácil para o desenvolvedor descobrir as bibliotecas disponíveis para integrar.

Este gerenciador, por trás, faz muitas configurações e mudanças na estrutura do projeto e te obriga a usar o Xcode Workspace para coexistir e funcionar junto com o seu projeto. Ele automatiza todo o processo de construção, vinculando a dependência aos targets, adicionando scripts no build phase e bibliotecas no link binary with libraries.

Os arquivos que precisam ser enviados juntos com o seu projeto são Podfile e Podfile.lock para que outros desenvolvedores consigam utilizar a mesma versão de dependência. Não é necessário efetuar o committing dos diretórios de Pods.

Ao mesmo tempo que um repositório centralizado facilita encontrar o portfólio de bibliotecas, como o desenvolvedor não precisa dar commit dos pods junto com seu projeto, isso pode ser um problema em caso de ausência de rede ou se o serviço do CocoaPods estiver inativo. Integrar o CocoaPods no projeto é fácil, mas retirá-lo leva mais tempo, pois exige muito trabalho manual.

Vantagens

  • Fácil de adicionar
  • Bibliotecas centralizadas
  • Automatiza o processo de building

Desvantagens

  • Obrigatório o uso de Xcode Workspace
  • Difícil remover depois de integrado
  • Muitas modificações na estrutura do projeto

Carthage

Carthage foi escrito em linguagem Swift e criado  como um gerenciador de dependências descentralizado, não existe uma lista de bibliotecas para o desenvolvedor consultar, ele tem que descobrir através do Github. Ele cria suas dependências e fornece estruturas binárias, mas não modifica automaticamente os arquivos e estruturas do projeto, e nem as configurações de compilação.

O desenvolvedor tem total controle sobre o que será adicionado ao Xcode, pois cabe a ele integrar as bibliotecas ao projeto. No início envolve algumas configurações manuais que podem resultar em  uma curva de aprendizado mais alta. Entretanto, a remoção do Carthage do projeto é simples.

Os arquivos Cartifle e Cartifle.resolved devem estar juntos ao projeto, para que outros desenvolvedores fiquem alinhados com as versões das bibliotecas. As pastas Build e Checkouts que contém os binários,  ficam a critério do desenvolvedor se elas serão enviadas para o repositório de controle de versão do seu projeto.

Vantagens

  • Processo de construção do projeto é rápido
  • Fácil de remover do projeto
  • Não altera estrutura do projeto
  • Fácil de integrar com um projeto já existente

Desvantagens

  • Etapas manuais para integrar a estrutura inicial
  • Tem menos contribuintes

Swift Package Manager

O Swift Package Manager (SwiftPM) é uma ferramenta para gerenciar a distribuição de código Swift. Ele é integrado ao Xcode e ao sistema de compilação Swift para automatizar o processo de download, compilação e vinculação de dependências.

Ele é capaz de gerenciar automaticamente as dependências de uma dependência dentro dos pacotes que são repositórios que contêm uma ou mais bibliotecas e executáveis. Inicialmente oferecia suporte apenas para macOS e Linux, mas desde o lançamento do Swift 5 e Xcode 11, o SwiftPM é compatível com iOS, macOS e tvOS.

A facilidade está no fato dele fazer parte da interface do Xcode e não precisar de nenhuma configuração inicial para integrá-lo ao projeto. Após adicionar a url da biblioteca e escolher a versão que deseja integrar, ele adiciona as dependências ao projeto. Através do arquivo Package.resolved ele controla as versões das dependências e garante que outro desenvolvedor execute o projeto com as versões adequadas das bibliotecas. A remoção de uma dependência é simples através da interface gráfica.

Vantagens

  • Desenvolvido pela Apple
  • Resolve problemas de dependências de uma dependência
  • Agora compatível com iOS
  • Fácil integração

Desvantagens

  • Apenas compatível apenas acima do Xcode 11
  • Compatibilidade com iOS relativamente nova (Junho de 2019)
  • Algumas bibliotecas ainda não prestam suporte

Conclusão

A ideia não é dizer qual dos três é o melhor, principalmente porque vantagens e desvantagens são relativas. Depende muito do projeto, das condições, do momento do desenvolvedor. Uma característica pode ser boa e ruim ao mesmo tempo, depende da perspectiva.

O fato do CocoaPods fazer coisas automáticas facilita a vida do desenvolvedor, mas ao mesmo tempo deixa ele sem controle do que está sendo feito. O Carthage exige um pouco de ação manual, mas deixa o projeto com uma estrutura mais limpa, sem muitas modificações por debaixo dos panos. O SwiftPM é nativo da Apple e integrado ao Xcode, mas ainda é muito recente e tem menos bibliotecas que prestam suporte.

Espero que essa breve descrição sobre esses gerenciadores seja útil para escolher o que melhor vai se adequar ao seu projeto atual.