Desenvolvimento

1 mai, 2017

Como criar um framework iOS com cookiecutter Swift

Publicidade

Criar um framework em iOS não é algo novo pra mim. Durante a minha carreira, tive a oportunidade de construir vários deles, e por vários motivos:

  • Criar uma abstração que possa ser usada novamente de projeto para projeto;
  • Compartilhar com a comunidade algo que você construiu;
  • Dividir seu projeto em módulos, entre outros.

E até hoje, cada vez que eu tenho que criar um framework iOS, eu me vejo repetindo o mesmo padrão:

pod lib create *

Sim, é isso mesmo. Cocoapods for the win!

Há alguns dias um amigo sugeriu o CookieCutter Swift, um template para criar frameworks iOS que não só permite que meu projeto suporte Cocoapods, como também Carthage e o Swift Package Manager. Neste artigo, vou mostrar como criar um framework iOS usando o CookieCutter e quais os benefícios de fazer isso. O framework que eu vou criar está aqui. Dá uma olhada no Readme. Quase tudo vem do template do CookieCutter, é ótimo! É realmente um Readme profissional sem esforço =)

Já falamos demais, show me the code!

Antes de tudo, vamos ter certeza que todo mundo está na mesma página, o que significa:

brew install carthage
brew install cookiecutter
cookiecutter https://github.com/cookiecutter-swift/FrameworkTemplate

Depois, você pode diminuir o comando para cookiecutter FrameworkTemplate. Entretanto, se você quiser usar o template mais recente, você tem que usar o comando completo acima.

Depois do comando, você vai ter uma estrutura de pastas assim:

Tem um monte de pastas e arquivos:

  • Cartfile;
  • Podspec;
  • PackageSwift;
  • Readme;
  • Xcode Project;
  • Sources/ Tests/ directories, entre outros…

O legal é que se você, assim como eu, veio do mundo “pod lib create”, ser capaz de usar o Carthage para importar o Nimble e o Quick é um grande passo, diga adeus a problemas de code complete e syntax highlight nos seus testes.

O jeito que o podspec é configurado, usando subspecs, também merece atenção. Muitos pods por ai se beneficiariam se adotassem este modelo. Muitas libraries o fazem com excelência, como a Moya, por exemplo. Você pode ver que a estrutura de pastas dela é muito similar a este template.

Projeto Xcode

O projeto em XCode é bem direto, especialmente neste exemplo. Swifixture é uma biblioteca que ajuda a carregar JSON dos arquivos. Ela também analisa esses arquivos usando frameworks específicos, definidos como Subspecs. Por enquanto, ela só suporta o ObjectMapper, mas eu (e eu espero que outros também) adicionei  suporte para outras bibliotecas de mapeamento.

Coisas para prestar atenção

Todas as vezes que você precisa especificar uma nova dependência para seu podspec, como eu fiz para ObjectMapper subspec, você vai precisar usar o Carthage. Tudo o que você precisa fazer é:

  • Adicioná-lo ao seu Cartfile. Assim:
github “Hearst-DD/ObjectMapper” ~> 2.2
  • Você tem que importar essa biblioteca para o seu projeto XCode, se não, as pessoas que instalarem sua lib usando o Carthage como dependência vão ter problemas. Você pode fazer isso clicando no botão “+”, abaixo de “Linked Frameworks and Libraries”.

Também tenha certeza de importar os arquivos do Carthage no seu teste, usando “Runpath Search Paths”, se não você vai ter problemas quando rodar.

  • A última coisa que você tem que se preocupar é como testar seu framework sem a necessidade de colocá-lo no Github. Testar localmente pode economizar bastante tempo, como vou explicar a seguir.

Testando localmente

Carthage

No projeto que vai consumir o a lib Carthage, edite o Cartfile. Ao invés de especificar uma URL do Github, o Carthage permite especificar uma URL Git com o padrão da pasta da sua biblioteca. Com isso, nós não precisamos fazer push de nenhum código no repositório Github para testá-lo. Basta testar localmente e mandar o push quando tudo estiver ok.

git “file:///Users/Thiago.Lioy/dev/mobilelabs/tmp/Swifixture” “master”

Cocoapods

Cocoapods também permitem testar localmente nossa biblioteca antes do push. Só precisamos especificar no Podfile. Podemos fazer isso usando o argumento path:

pod 'Alamofire', :path => '~/Documents/Alamofire'

Conclusão

Esse template de framework CookieCutter foi um grande avanço para meu conjunto de ferramentas iOS. Espero que você também gostem. É uma abordagem muito melhor que o antigo “pod lib create”, e deixa seu projeto compatível com Carthage e swiftPackage manager. Se você tiver alguma dúvida, opinião ou feedback, aproveite os campos abaixo. Até a próxima!

***

Este artigo foi originalmente publicado (em inglês) no Cocoa Academy e na Concrete Solutions