O Carthage é um gestor de dependências para projetos iOS e macOS que permite aos programadores integrar bibliotecas de terceiros nas suas aplicações de forma simples e eficiente. Ao contrário de outras ferramentas, como o CocoaPods, o Carthage aposta em ser minimalista e não invasivo, o que significa que não altera a estrutura do projeto e apenas exige um simples ficheiro de texto, um Cartfile, com a lista das dependências. Isto fez dele uma escolha popular entre os programadores que querem manter o controlo da configuração do seu projeto enquanto beneficiam de bibliotecas e frameworks de terceiros.
O Carthage funciona compilando frameworks binários, que podem depois ser integrados diretamente em projetos Xcode. Esta abordagem significa que os programadores podem beneficiar de tempos de compilação mais rápidos e de um processo de desenvolvimento mais simplificado. Com o Carthage, as dependências podem ser facilmente acrescentadas, atualizadas e geridas sem ficheiros de configuração complexos nem alterações indesejadas ao projeto. Em contrapartida, os frameworks compilados são acrescentados manualmente ao Xcode. Isto faz do Carthage uma boa ferramenta para quem quer uma solução de gestão de dependências simples mas poderosa nos seus projetos de desenvolvimento para iOS e macOS.
O Carthage é um gestor de dependências descentralizado para projetos iOS e macOS. Obtém e compila bibliotecas de terceiros como frameworks, que o próprio programador acrescenta depois ao seu projeto Xcode, sem que o ficheiro do projeto seja alterado automaticamente. Isto dá controlo total sobre a estrutura do projeto e pode proporcionar tempos de compilação mais rápidos, porque as dependências só são compiladas quando são atualizadas. O Carthage é utilizado sobretudo como uma alternativa mais simples ao CocoaPods, enquanto o Swift Package Manager é a solução integrada da Apple para a gestão de pacotes.
Mais sobre Carthage
O Carthage é um gestor de dependências para iOS e macOS que oferece uma forma simples e flexível de integrar bibliotecas de terceiros nos projetos. Ao contrário de outras ferramentas que alteram automaticamente a configuração do projeto, o Carthage aposta numa configuração mínima e dá aos programadores liberdade para gerir os seus projetos sem restrições desnecessárias.
Tecnicamente, o Carthage funciona compilando frameworks binários a partir do código-fonte, ou transferindo-os já compilados, o que permite aos programadores incluir estes frameworks diretamente nos seus projetos Xcode. Isto significa que o Carthage não altera os ficheiros do projeto, gerando antes uma pasta «Carthage/Build» na qual são guardados os frameworks compilados. Esta abordagem dá aos programadores controlo total sobre a estrutura e as dependências do seu projeto.
O Carthage suporta três funções principais, cada uma oferecendo uma forma diferente de tratar as dependências:
Compilação de dependências: O Carthage pode compilar automaticamente todas as dependências especificadas num «Cartfile». Isto permite aos programadores concentrarem-se no seu próprio código enquanto o Carthage trata da compilação das bibliotecas externas. Esta função é ideal para projetos que exigem várias bibliotecas de terceiros.
Atualização de dependências: Com um único comando, o Carthage pode atualizar todas as dependências para as versões mais recentes que cumprem os requisitos de versões do Cartfile. Isto facilita manter as bibliotecas atualizadas, incluindo correções de segurança, o que é importante para manter a compatibilidade e a segurança.
Integração de frameworks: O Carthage gera frameworks que o próprio programador acrescenta ao projeto Xcode, normalmente em «Frameworks, Libraries, and Embedded Content». Isto exige um passo manual, mas dá uma visão completa de exatamente que bibliotecas fazem parte do projeto e facilita o aproveitamento de novas funcionalidades e melhorias nas bibliotecas de terceiros.
Um dos maiores pontos fortes do Carthage é a sua simplicidade e flexibilidade. Ao evitar alterações automáticas ao projeto, o Carthage permite aos programadores manter o controlo dos seus projetos. Isto reduz o risco de conflitos no ficheiro do projeto e facilita a integração de novas dependências sem perturbar as estruturas de projeto existentes.
A abordagem do Carthage à gestão de dependências poupa também tempo no trabalho diário. Ao compilar as dependências apenas quando são acrescentadas ou atualizadas, e ao evitar alterações desnecessárias ao projeto, o Carthage minimiza o tempo e os recursos necessários para manter um projeto. Isto torna-o uma boa ferramenta para programadores que querem otimizar os seus fluxos de trabalho e concentrar-se em entregar software de elevada qualidade.
Na prática, o Carthage teve um impacto significativo na forma como os programadores gerem as dependências em projetos iOS e macOS. Foi utilizado por equipas de desenvolvimento pequenas e grandes para manter os seus projetos atualizados, seguros e fáceis de manter. Hoje, no entanto, o desenvolvimento do Carthage abrandou consideravelmente e a maioria das bibliotecas visa agora primeiro o Swift Package Manager.
Em resumo, o Carthage é uma ferramenta que combina simplicidade, flexibilidade e eficiência numa solução que torna a gestão de dependências mais transparente tanto para programadores individuais como para grandes equipas. A sua configuração simples e a intervenção mínima na estrutura do projeto fizeram dele uma ferramenta útil no desenvolvimento de apps, onde são necessárias integrações rápidas e seguras.
Perguntas frequentes sobre Carthage
O que é o Carthage e como funciona na prática?
O Carthage é um gestor de dependências descentralizado para projetos iOS, macOS, tvOS e watchOS escritos em Swift e Objective-C. Não existe um registo central de pacotes. Em vez disso, cada dependência aponta diretamente para um repositório Git, normalmente no GitHub.
As dependências são especificadas num ficheiro de texto chamado Cartfile na pasta raiz do projeto. Quando o comando carthage update é executado, o Carthage encontra versões adequadas, obtém o código-fonte para a pasta Carthage/Checkouts e compila cada biblioteca com as ferramentas de compilação do próprio Xcode. Os frameworks finais são colocados em Carthage/Build.
O Carthage não altera o ficheiro do projeto Xcode. O programador acrescenta os frameworks compilados em Frameworks, Libraries, and Embedded Content no target relevante. Isto dá controlo total sobre a configuração do projeto, mas exige um pouco mais de trabalho manual do que as ferramentas que fazem a integração automaticamente.
Como se instala o Carthage e como se acrescenta uma biblioteca?
O Carthage é instalado na maioria das vezes com o Homebrew, através do comando brew install carthage. Em alternativa, pode ser transferido um pacote de instalação a partir das versões (releases) do projeto no GitHub.
Uma biblioteca é normalmente acrescentada em quatro passos:
- Cria-se o ficheiro
Cartfilena pasta raiz do projeto com uma linha comogithub "Alamofire/Alamofire" ~> 5.0. - O comando
carthage update --use-xcframeworks --platform iOSobtém e compila a biblioteca. - O
.xcframeworkfinal emCarthage/Buildé arrastado para Frameworks, Libraries, and Embedded Content no target da app. - Para frameworks dinâmicos, seleciona-se Embed & Sign.
O operador ~> significa que são aceites versões mais recentes desde que a versão principal se mantenha. A biblioteca pode depois ser utilizada no código com import Alamofire.
Qual é a diferença entre Cartfile e Cartfile.resolved?
O Cartfile descreve de que dependências o projeto precisa e que requisitos de versões devem cumprir, por exemplo ~> 5.0, >= 2.1 ou um ramo específico. O ficheiro é editado manualmente e exprime a intenção.
O Cartfile.resolved é gerado automaticamente e contém as versões ou commits exatos que foram efetivamente escolhidos, incluindo para as dependências das próprias dependências. O ficheiro funciona como um bloqueio, para que todos numa equipa e todos os servidores de compilação obtenham exatamente o mesmo código.
A diferença nota-se nos comandos:
carthage updateencontra as versões mais recentes que correspondem aoCartfilee escreve o resultado noCartfile.resolved.carthage bootstrapobtém e compila exatamente as versões indicadas noCartfile.resolved.
Ambos os ficheiros devem, por isso, ser mantidos no controlo de versões. As dependências utilizadas apenas durante o desenvolvimento, como bibliotecas de teste, podem ser colocadas em Cartfile.private.
Como compila o Carthage XCFrameworks e porque é que isso é importante?
Antigamente, o Carthage compilava os chamados fat frameworks, nos quais o código para dispositivos físicos e para o simulador era combinado num único ficheiro com a ferramenta lipo. Isto deixou de funcionar com o Xcode 12, porque tanto os dispositivos como os simuladores em Apple Silicon utilizam a arquitetura arm64, e a mesma arquitetura não pode aparecer duas vezes num fat framework.
A solução são os XCFrameworks, que a Apple introduziu com o Xcode 11. Um XCFramework é um pacote com um binário separado para cada plataforma e variante, como dispositivo iOS e simulador iOS. A partir do Carthage 0.37, os XCFrameworks são compilados com a flag --use-xcframeworks, por exemplo carthage bootstrap --use-xcframeworks.
O resultado é colocado em pastas .xcframework em Carthage/Build. São acrescentadas diretamente ao target da app, e a antiga fase de compilação com carthage copy-frameworks deixa de ser necessária.
Qual é a diferença entre o Carthage, o CocoaPods e o Swift Package Manager?
As três ferramentas resolvem a mesma tarefa, mas de formas diferentes:
- Carthage é descentralizado e obtém as dependências diretamente dos repositórios Git especificados num
Cartfile. As bibliotecas são compiladas como frameworks binários e o projeto Xcode não é alterado. A integração é feita manualmente. - CocoaPods utiliza um registo central de bibliotecas e um
Podfile. O comandopod installcria um workspace e altera a configuração do projeto, pelo que a integração acontece automaticamente, mas é menos transparente. O CocoaPods está agora em modo de manutenção. - Swift Package Manager (SPM) é a ferramenta da própria Apple e está integrado no Xcode. Os pacotes são acrescentados diretamente no Xcode ou descritos num
Package.swift, e não é necessária nenhuma instalação adicional.
O Carthage é útil quando se pretende controlo total sobre o ficheiro do projeto e tempos de compilação mais curtos, porque as dependências só são compiladas quando são atualizadas. Para novos projetos, o SPM é agora a escolha mais utilizada, uma vez que a maioria das bibliotecas o suporta.
Como se podem manter baixos os tempos de compilação com o Carthage?
Como o Carthage compila por predefinição as dependências a partir do código-fonte, a primeira compilação pode demorar bastante. Várias opções podem reduzir o tempo:
--platform iOSlimita a compilação às plataformas que o projeto efetivamente utiliza.--cache-buildsignora as dependências que já foram compiladas na mesma versão, pelo que apenas as bibliotecas alteradas são recompiladas.- As dependências individuais podem ser atualizadas separadamente, por exemplo com
carthage update Alamofire, em vez de as atualizar todas. - Muitas bibliotecas disponibilizam frameworks pré-compilados nas suas versões no GitHub, que o Carthage transfere automaticamente. Os SDKs de código fechado podem ser especificados com
binarye um URL para uma especificação JSON.
Nos servidores de compilação, a pasta Carthage/Build pode também ser guardada em cache entre execuções. Muitas equipas mantêm a pasta fora do Git através do .gitignore e recriam-na com carthage bootstrap.
Carthage para manequins
O Carthage é uma ferramenta que ajuda a organizar e gerir as pequenas peças de que as apps são feitas, chamadas «dependências». Imagina que estás a criar uma app que precisa de algumas peças já feitas por outras pessoas para funcionar melhor. O Carthage ajuda a ir buscar estas peças e a manter o controlo delas, para que não tenham de ser feitas de raiz. Funciona um pouco como um bibliotecário que guarda todos os livros necessários para um projeto, para que o escritor se possa concentrar na sua própria história. Torna o desenvolvimento de apps mais fácil e rápido, porque o trabalho de outras pessoas pode ser reutilizado, garantindo ao mesmo tempo que tudo encaixa.