CocoaPods - O gerenciador de dependências no iOS

CocoaPods - O gerenciador de dependências  no iOS
fabio.pimentel
fabio.pimentel

Compartilhe

Usar bibliotecas de terceiros certamente é uma das facilidades no desenvolvimento de software. Gerenciar isso em um projeto nem sempre é uma tarefa trivial já que temos versões diferentes de uma mesma biblioteca, outras vezes dependências transitivas que se conflitam. Para resolver esses problemas e facilitar a comunicação do time de desenvolvedores as ferramentas de gerenciamento de dependências existem. São exemplos dessas ferramentas: Ivy nos projetos Java e Bundle nos de Ruby.

cocoapods-banner

No iOS uma ferramenta que vem se tornando padrão nos projetos, motivada também pela dificuldade de importar bibliotecas e disponibilizá-las no Xcode, é o CocoaPods embora ela também sirva para aplicações para OSX.

Instalação do CocoaPods

A sua distribuição se dá em forma de Gem (bibliotecas do mundo Ruby). Para instalar basta o famoso comando de instalação:

 gem install cocoapods 

Normalmente um arquivo com a definição das dependências é usado no diretório do projeto e tem o nome de Podfile. Nele a primeira definição é sobre para qual plataforma o projeto está sendo desenvolvido.

 platform :ios, '7.0' 

A partir disso é declarar as bibliotecas a serem usadas e definir a versão com a declaração pod que o projeto usa:

 platform :ios, '7.0'

pod 'AFNetworking', '~> 2.2.0' 

Os operadores que podem ser especificados junto com uma dependência são: >, >=, <, <= e ~>. No Podfile anterior, o operador ~> diz que qualquer versão que mantenha o MAJOR e o MINOR pode ser usado, ou seja, 2.2.0 e 2.2.1 (já que só muda o PATCH) seriam aceitos mas 2.3.0 ou qualquer acima dela não. Para mais detalhes sobre a semântica do versionamento acesse http://semver.org/.

Depois da definição das dependências um comando é usado para a download e instalação:

 pod install 

E sua saída é:

saida_pod_install.png

Note que agora devemos usar o .xcworkpace como projeto no Xcode e não mais o .xcodeproj. Sendo assim ao abrirmos o projeto na IDE, nosso Project Navigator estará dessa forma:

Project Navigator

Além disso um arquivo chamado Podfile.lock foi gerado no diretório da aplicação. De acordo com ele a versão de fato instalada do AFNetworking foi a 2.2.1. Observe-o:

Arquivo Podfile.lock

Existindo um Podfile.lock no projeto a execução do comando pod install irá baixar e instalar apenas as versões das bibliotecas especificadas no .lock . Portanto é fundamental que esse arquivo seja adicionado ao repositório do projeto para que todos os desenvolvedores tenham o mesmo .lock e por consequência usem sempre as mesmas versões. Caso uma alteração seja necessário no Podfile basta usarmos o comando pod update que atualizará o Podfile.lock .

Por ser tão prático e simples de usar o CocoaPods tem sido figurinha carimbada nos projetos iOS.

Criando nossos próprios Pods

Além da facilidade de uso, a praticidade de disponibilizar bibliotecas através desse gerenciador é mais um dos motivos de seu sucesso. Para criar o seu próprio Pod, um arquivo contendo a especificação da biblioteca é necessário. O Pod Spec pode ser gerado usando o comando pod spec create que não faz nada além de gerar um .podspec auxiliar. As configurações mínimas são as seguintes:

 Pod::Spec.new do |s| s.name         = "FPLibrary" s.version      = "1.0.0" s.summary      = "Just another library" s.homepage     = "http://www.fplibrary.com.br" s.license      = 'Apache License, Version 2.0' s.author       = { "Fábio Pimentel" => "[email protected]" } s.platform     = :ios, '7.0' s.source       = { :git => "https://github.com/fabiopimentel/fplibrary.git", :tag => "1.0.0" } s.source\_files  = "Classes/\*.{h,m}" end 

Esse arquivo deve estar disponível em um diretório a ser adicionado no repositório das especificações do CocoaPods. O repositório é chamado de Spec Repo e acessado via github.com/CocoaPods/Specs. Dessa forma teremos  uma estrutura similar a essa do Spec do AFNetworking de versão 2.2.1:

Screen Shot 2014-04-16 at 4.35.17 AM.png

Portanto para cada  nova versão existe a necessidade de mais um subdiretório com o número e dentro dele um específico .podspec. Como a seguinte estrutura:

├── Specs(Spec Repo) └── ```SPEC_NAME

    └── ```VERSION

        └── ```SPEC\_NAME

.podspec

Para submeter nossas alterações um pull request deve ser feito, mas não antes de validar a spec  com um  pod spec lint na estrutura do Spec Repo clonada.

Adicionando um repositório privado

É bastante comum a prática de reaproveitar componentes e as vezes até mesmo bibliotecas internas em nossos projetos. Para este cenário temos a opção de criar um repositório privado. Esse repositório deve seguir a mesma convenção de diretórios do repositório principal que já vimos acima. E pode ser adicionado como fonte de Specs fazendo:

pod repo add nome-do-repositorio url-do-repositorio

Com toda essa simplicidade fica difícil não fazer tanto sucesso não é mesmo? Participe da Mobile Conf 2014 e venha ver esse e mais assuntos ligados ao dia-a-dia do desenvolvedor iOS na minha palestra. Se você já usa o Cocoa Pods, ou considera usá-lo nos próximos projetos, comente e compartilhe conosco suas experiências.

Veja outros artigos sobre Mobile