Table of Contents
Introdução ao Gerenciamento de Dependência no iOS
O desenvolvimento moderno do iOS raramente começa do zero. Bibliotecas de terceiros lidam com tudo, desde a análise de redes e JSON a componentes de interface e cache de imagens. Sem uma abordagem estruturada, baixar frameworks manualmente, resolver conflitos de versões e vincular binários rapidamente se torna um pesadelo de manutenção. É aí que os gerentes de dependência entram.
Os CocoaPods e Carthage são as duas ferramentas mais estabelecidas para gerenciar dependências em projetos iOS. Enquanto os CocoaPods oferecem uma integração simplificada e baseada no espaço de trabalho, a Carthage segue uma filosofia descentralizada, de construção e de desenvolvimento. Entender os pontos fortes e os trade-offs de cada uma ajuda você a escolher a abordagem certa para sua equipe, seu aplicativo e seu pipeline de implantação.
CacauPods: Centralizado e Automatizado
O CocoaPods tem sido o gestor de dependência dominante desde a sua introdução. Ele usa um índice central chamado CacoaPods Specs e gera uma área de trabalho Xcode que lida com todas as dependências automaticamente. Isto significa que você pode adicionar uma biblioteca simplesmente declarando- a num Podfile, execute um comando e comece imediatamente a importá- la no seu código.
Instalação e Configuração
O CocoaPods é instalado através do RubyGems. macOS ships com o Ruby, mas poderá necessitar de actualizar ou usar um gestor de versões do Ruby. O comando de instalação padrão é:
sudo gem install cocoapods
Após a instalação, navegue até o diretório do projeto e inicialize um Podfile:
pod init
Isto cria um ficheiro de texto simples chamado Podfile. Você então editá- lo para especificar a sua plataforma de destino, qualquer (necessário para bibliotecas Swift), e as dependências que necessita. Um Podfile típico parece com isto:
platform :ios, '15.0'
target 'MyApp' do
use_frameworks!
pod 'Alamofire', '~> 5.7'
pod 'SwiftyJSON', '~> 5.0'
pod 'SDWebImage', '~> 5.15'
end
Quando o Podfile estiver pronto, execute:
pod install
CocoaPods baixa as versões especificadas, resolve dependências e gera um arquivo . A partir daí, você deve abrir o espaço de trabalho – não o original – para construir e executar seu aplicativo.
Características avançadas de CacauPods
- Subspecs: Muitas bibliotecas permitem que você importe apenas um subconjunto de sua funcionalidade. Por exemplo, reduz a pegada binária.
- [[FLT: 0]] Caminhos locais: Você pode apontar para uma pasta local para bibliotecas privadas:
- Fontes baseadas em git: As dependências podem vir de qualquer repositório Git:
- Podfile.lock: Este arquivo bloqueia cada dependência para uma versão específica, garantindo que as construções reproduzíveis em toda a sua equipe e CI.
- Plugins: Você pode estender CocoaPods com plugins para SwiftLint, Firebase ou scripts de construção personalizados.
CocoaPods também suporta alvos multiplataforma. Você pode ter diferentes conjuntos de dependência para iOS, macOS e watchOS por aninhar blocos dentro de um único Podfile.
Ganchos pós-instalar e personalização
Uma necessidade comum é executar um script após cada . Por exemplo, você pode querer tirar arquiteturas de simuladores de compilações de lançamento. Isto é feito com um gancho :
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.0'
end
end
end
Tais ganchos dão-lhe um controle fino sobre o projeto Pods gerado, mas também adicionam complexidade. O excesso de uso pode tornar seu Podfile difícil de ler e manter.
Carthage: Descentralizado e Desativado
Carthage adota uma abordagem diferente. Em vez de centralizar metadados, ela depende de tags Git e dos projetos Xcode de cada biblioteca. Carthage constrói os frameworks em sua máquina e deixa a etapa de integração – arrastando frameworks para seu projeto Xcode – inteiramente para você. Essa interferência mínima é atraente para desenvolvedores que querem controle completo e uma pegada menor no controle de sua versão.
Instalação e Configuração
A carthage é tipicamente instalada via Homebrew:
brew install carthage
Em seguida, crie um arquivo de texto simples chamado Cartfile] no seu root do projeto. A sintaxe é semelhante ao CocoaPods, mas aponta para repositórios do GitHub ou qualquer fonte Git:
github "Alamofire/Alamofire" ~> 5.7
github "SwiftyJSON/SwiftyJSON" ~> 5.0
github "onevcat/Kingfisher" ~> 7.0
Depois de editar o Cartfile, execute:
carthage update --platform iOS
Este comando clona os repositórios, verifica as versões marcadas e constrói as estruturas usando o Xcode. Os binários resultantes são colocados na pasta Carthage/Build/iOS. Você então os arrasta manualmente para o seu projeto Xcode sob a seção "Frameworks, Libraries e Content Incorporado", certificando-se de adicioná- los ao alvo apropriado.
Principais diferenças em relação aos CacauPods
- Sem espaço de trabalho: Carthage não modifica o seu ficheiro de projecto. Você mantém-se no controlo das referências de ficheiros e das definições de compilação.
- Criar velocidade: Carthage pode criar caches. Na CI, você pode pré-construir dependências para acelerar o pipeline.
- Versioning: Carthage usa um Cartfile.resolved[ para bloquear versões, semelhante ao Podfile.lock.
- Frameworks binários: Algumas bibliotecas enviam binários . Cartago pode baixar esses diretamente, pulando o passo de compilação e economizando tempo.
- XCFramework support: Desde Cartago 0.38, ele pode produzir XCFrameworks, que funcionam perfeitamente com o Swift Package Manager e eliminam a necessidade de arquiteturas de simulador de strip.
Manuseamento de Frameworks com Dependências
Um desafio com Carthage é que ele constrói dependências em sequência. Se a biblioteca A depende da biblioteca B, você deve listar ambos no arquivo Cart. Carthage resolve a árvore de dependência automaticamente, mas você ainda precisa ligar todas as dependências transitórias no seu projeto manualmente. Isto lhe dá visibilidade em cada binário contra os links de sua aplicação, mas também aumenta a chance de faltar uma estrutura necessária em tempo de execução.
Comparando CacauPods e Cartago: Um Guia Prático
A escolha entre os dois depende do tamanho do seu projeto, maturidade da equipe e fluxo de trabalho de implantação. A tabela abaixo resume os principais trade-offs.
| Factor | CocoaPods | Carthage |
|---|---|---|
| Setup complexity | Low – one command, workspace generated automatically. | Medium – requires manual linking of frameworks. |
| Build system control | Lower – CocoaPods merges project files and may override build settings. | Higher – you control project structure and build phases. |
| Integration with Xcode | Tight – workspace includes Pods project, all configurations preset. | Loose – you add frameworks manually; no workspace changes. |
| CI/CD compatibility | Good – pod install works reliably in CI, but full rebuild on each run if lockfile changes. |
Excellent – prebuilt frameworks can be cached; build times are faster. |
| Swift Package Manager migration | Can coexist but may cause conflicts if both manage the same library. | Can coexist more easily because Carthage does not modify project files. |
| Community and library availability | Widest coverage – almost every popular library has a CocoaPods spec. | Good coverage – but some niche libraries may not be Carthage-friendly. |
Quando usar os CocoaPods
- Você está começando um novo projeto e quer o mínimo de caldeira.
- Sua equipe inclui desenvolvedores júnior que se beneficiam de uma integração de mãos-fora.
- Você precisa de uma biblioteca que só está disponível via CocoaPods (ainda acontece para alguns pods legados ou proprietários).
- Você confia fortemente em plugins CocoaPods (por exemplo, para verificação de lint ou geração de código).
Quando usar Cartago
- Você valoriza a modularidade e deseja evitar o inchaço do projeto "Pods".
- Seu aplicativo é grande, e você precisa otimizar os tempos de construção através do cache de frameworks pré-construídos.
- Você está migrando para o Swift Package Manager e quer uma transição gradual sem quebrar integrações existentes.
- Você trabalha em uma equipe que prefere manter o projeto Xcode magro e gerenciar manualmente configurações de construção.
Migração entre os gestores de dependência
Mudar de CocoaPods para Cartago ou vice-versa é possível, mas requer planejamento cuidadoso. Aqui estão os passos de alto nível.
Migração de CacauPods para Cartago
- Remova o Podfile, Podfile.lock e a área de trabalho.
- Remova quaisquer fases de compilação relacionadas com os Pods (por exemplo, “Frameworks de Pods embutidos”).
- Crie um Cartfile e lista as mesmas bibliotecas (assegurando que eles suportam Cartago).
- Corre .
- Adicione manualmente cada framework de Carthage/Build/iOS ao projeto Xcode.
- Atualizar todas as declarações de importação – sob Cartago, você importa frameworks diretamente (por exemplo, ).
- Teste cuidadosamente; dependências transitivas podem agora necessitar de ligação explícita.
Migração de Cartago para CacauPods
- Remova as fases de compilação relacionadas com Cartago e as referências de framework do projeto Xcode.
- Excluir o Cartfile e Cartfile.resolved.
- Executar para criar um Podfile.
- Adicione todas as dependências com restrições de versão apropriadas.
- Executar e então abrir o novo espaço de trabalho.
- Verifique se existem importações duplicadas – os CocoaPods podem incorporar bibliotecas de forma diferente.
- Atualizar configurações de compilação, se necessário (por exemplo, ).
Melhores práticas para ambos os gerentes
Independentemente da ferramenta que você escolher, seguir essas práticas manterá seu projeto saudável.
- Commit lock files:] Sempre commit Podfile.lock ou Cartfile.resolved para controle de versão. Isto garante que cada membro da equipe e servidor CI use exatamente as mesmas versões.
- Versões de pin cuidadosamente: Use operadores otimistas ()] para permitir pequenas atualizações ao bloquear grandes mudanças de quebra. Especifique versões exatas apenas quando você precisar de estabilidade absoluta.
- Executa atualizações deliberadamente: Não execute ou sem rever os changelogs das dependências atualizadas. Agendar alterações de versão com planejamento sprint.
- Audite para compatibilidade com a versão Swift: Algumas bibliotecas podem não suportar a versão Swift que o seu projeto usa. Verifique se o ramo ou tag da dependência corresponde à sua cadeia de ferramentas Swift.
- Remova dependências não utilizadas: Revise periodicamente o seu Cartfile ou Podfile e remova bibliotecas que não são mais usadas.Dependências órfãs incham o binário e aumentam a superfície de ataque.
- Considere SPM para novos projetos: O Swift Package Manager agora é incorporado no Xcode e suportado pela maioria das bibliotecas principais. Se você está começando do zero, SPM pode ser a escolha mais simples. Tanto CocoaPods quanto Carthage permanecem excelentes para gerenciar grandes projetos legados ou frameworks privados.
Resolver Problemas Comuns
CacauPods: “Espec não encontrado”
Isto significa normalmente que a biblioteca não foi empurrada para o tronco do CacauPods ou que você está usando um nome errado. Verifique o nome do pod em coapods.org. Se a biblioteca é privada, você precisa especificar sua fonte no seu Podfile.
CacauPods: Conflitos em dependências transitivas
Executar e inspecionar o resultado. Você pode precisar adicionar restrições explícitas de versão para pods transitivos. Usando e um novo pode repor o gráfico de dependência.
Carthage: “Não tal módulo” ao construir
Isso acontece frequentemente porque o framework não foi construído para a plataforma correta (por exemplo, você construiu com por engano). Re-run e verificar a pasta de saída. Também garantir que você adicionou o framework à seção “Frameworks, Bibliotecas e Conteúdo Incorporado”, não apenas o navegador do projeto.
Carthage: A compilação falha por causa das dependências em falta
Se uma biblioteca que você está usando tiver suas próprias dependências (como dependências RxSwift), você deve listá-las no seu arquivo de carrinho. Carthage não baixa automaticamente dependências transitivas a menos que elas apareçam no arquivo de carrinho ou sejam especificadas como submódulos.
Abordagens híbridas: Usando tanto os CocoaPods quanto a Cartago
Embora não seja recomendada a mistura de gestores de dependência num único projecto, algumas equipas o fazem por necessidade. Por exemplo, uma biblioteca crítica só poderá estar disponível através de CocoaPods, enquanto o resto do projecto usa Carthage. Se tiver de combiná- los, mantenha o espaço de trabalho do CocoaPods separado e ligue manualmente os frameworks do Carthage. Esteja ciente dos potenciais conflitos em símbolos duplicados ou sobrepondo recursos. A solução mais simples é normalmente escolher um gestor e migrar quaisquer bibliotecas que não sejam suportadas.
O futuro do iOS Dependência Management
O Swift Package Manager (SPM) é agora considerado o padrão pela Apple e é integrado diretamente no Xcode 11 e posterior. A maioria das bibliotecas de código aberto adicionaram suporte SPM, e SPM elimina a necessidade de ferramentas externas. No entanto, tanto CocoaPods quanto Carthage ainda têm vantagens:
- CocoaPods oferece uma personalização rica através de ganchos e plugins, e seu repositório de especificações continua sendo a maior coleção de bibliotecas iOS.
- Carthage dá-lhe o controle total sobre o processo de compilação e é mais fácil de cache, tornando-o popular em fluxos de trabalho CI-pesados.
Muitas equipes usam SPM para novas dependências, mantendo integrações legadas com CocoaPods ou Cartago. Com o tempo, o SPM deve se tornar o padrão, mas por enquanto, entender todas as três ferramentas permite que você trabalhe em qualquer base de código iOS.
Conclusão
A gestão eficaz da dependência é uma pedra angular do desenvolvimento profissional do iOS. O CocoaPods fornece uma solução chave na mão que automatiza todo o processo de integração, tornando-o ideal para equipes que querem velocidade e simplicidade. A Carthage oferece uma abordagem mais magra e transparente que dá aos desenvolvedores controle granular sobre sistemas de construção e estrutura de projetos. Ao dominar ambas as ferramentas, você pode escolher o ajuste certo para o tamanho, complexidade e fluxo de trabalho do seu projeto. Qualquer que seja o que você escolher, sempre compromete arquivos de bloqueio, atualiza dependências deliberadamente e fica de olho na evolução do Swift Package Manager.
Para mais informações, explore os guias oficiais de CacauPods e o repositório de Carthage GitHub.