XcodeGen: garantindo a escalabilidade de times iOS

Neste artigo você vai ver:

Vamos te apresentar exemplos práticos de XcodeGen, que vão tornar a implementação muito mais fácil em seus projetos, gerando escalabilidade nos times que trabalham com desenvolvimento de iOS.

O que é XcodeGen?

Se você é uma pessoa desenvolvedora iOS, já deve ter passado pela experiência de resolver conflitos por conta de alterações no xcodeproj, porque quando um arquivo é adicionado ou mesmo uma config é modificada no projeto gera alterações no xcodeproj.

Ter muitas pessoas trabalhando em um mesmo projeto pode gerar uma quantidade insana de conflitos, tornando difícil gerenciar na hora de mergear um PR. Por conta disso, foi criada uma command line tool chamada XcodeGen, que gera o xcodeproj a partir da sua estrutura de pastas e um arquivo chamado project.yaml.

Entendendo o que o XcodeGen faz por debaixo dos panos

Quando o Xcode vai gerar um binário ou mesmo um .framework, ele busca informações que estão contidas nas camadas: target, target.xconfig, project, project.xcconfig e SDK defaults.

Então, utilizar o xcodeproj gerado pelo Xcode faz com que cada arquivo adicionado no projeto gere alterações nos mesmos e alguns outros são criados e modificados dependendo das configurações que são feitas via Xcode.

Conhecendo isso, o XcodeGen faz com que essas configurações que estão no seu  project.yaml e nos diretórios do projeto, sejam convertidas em um .xcodeproj.

Uma vez explicado a motivação e a sua resolução na teoria, podemos partir para a prática. Assim, vamos instalar e configurar o XcodeGen garantindo uma maior escalabilidade do seu time quando o assunto for desenvolvimento de iOS.

Como utilizar o XcodeGen em suas aplicações 

Primeira coisa que você precisa fazer é instalar o XcodeGen na sua máquina, pra isso execute o seguinte comando no terminal do Mac:

brew install xcodegen

Depois de instalado, vá na raiz do seu projeto e crie o arquivo project.yaml. Caso você não tenha uma aplicação já rodando, crie uma aplicação no Xcode e depois execute o comando abaixo:

touch project.yml

Parabéns, agora que conseguimos instalar, vamos colocá-lo em ação. Para isso, faremos um projeto simples com testes.

Um exemplo simples de aplicação usando o XcodeGen

O XcodeGen ajuda a nossa vida em diversos aspectos e a boa notícia é que podemos simplificar ainda mais! Com um arquivo que já tem os comandos que serão executados nele, o arquivo funcionará como um menu de opções para o XcodeGen.

 name: exemplo  # nome do seu modulo 
options:
    bundleIdPrefix: "com.zup.teste" # bundle Id do seu modulo
    deploymentTarget:
        iOS: "11.0"
    createIntermediateGroups: true


targetTemplates:
    Default:


targets:
    "exemplo":  # nome do seu modulo que também vai ser seu target principal
        templates: Default
        type: framework
        platform: iOS
        sources: ["exemplo"] # a pasta onde está seu código
        dependencies: []

Caso seu projeto tenha testes: 

  "exemploTests":  # coloque aqui o nome do seu target de testes
       templates: Default
       type: bundle.unit-test
       platform: iOS
       dependencies:
           - target: exemplo # coloque aqui o target que vai ser testado nos seus testes
       sources: ["exemploTests"] # a pasta onde está seu código

PS: só adicione essa linha postGenCommand: pod install , caso seu projeto tenha PodFile.

Pronto! Depois de fazer isso, remova seu xcodeproj, e rode o seguinte comando:

xcodegen

E você verá no terminal:

$ xcodegen

⚙️  Generating plists…

⚙️  Generating project…

⚙️  Writing project…

Created project at -/projects/test/test.xcodeproj

Isso vai criar um novo xcodeproj no seu diretório atual. Caso, o xcodeproj já tenha sido commitado em seu git, execute:

git rm --cached seuprojeto.xcodeproj

E agora adicione-o no gitignore:

*.xcodeproj

Agora só executar o seu projeto no Xcode e ser feliz!

Simplificando as configurações do XcodeGen com makefile

Agora como que faço para executar comandos na pipeline que exigem o xcodeproj, se ele não se encontra mais no git? Ou mesmo como facilitar esse processo para pessoas da minha equipe que ainda não conhecem o XcodeGen?

Calma, é bem simples. Vamos primeiro criar um arquivo makefile:

touch makefile

E adicione nele as instruções abaixo:

.DEFAULT_GOAL := help
XCODE_DERIVEDDATA=./DerivedData
BUNDLE=$(if $(rbenv > /dev/null), rbenv exec bundle, bundle)


install: ## install required dependencies -
   make install_bundle
  
generate:## generate xcode gen
    xcodegen


generate_open:## generate xcode gen and open
    xcodegen && open DesignSystem.xcodeproj


setup: ## installs project dependencies
   brew install xcodegen
  
   gem install bundler
  
    $(BUNDLE) install
    $(BUNDLE) update --all


    xcodegen
    open teste.xcodeproj




install_bundle: ## install gems
   $(BUNDLE) install
   $(BUNDLE) update --all


deintegrate: ## remove derivedata e xcodeproj
    rm -rf teste.xcodeproj && rm -rf ${XCODE_DERIVEDDATA}


help:
   @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'

PS: se você tiver usando outras dependências no seu projeto que precisam ser instaladas pelo brew adicione-las na seção de setup.

Quando você executar make na raiz, ele vai te mostrar todas as opções. Execute make setup e depois make generate_open isso vai fazer com que você abra o projeto depois de gerado.

Adicionalmente, esse comando vai te pedir um GemFile, onde você pode instalar o fastlane, cocoapods e outras dependências que o seu projeto precise, como:

source "https://rubygems.org"


gem "fastlane"
gem 'xcode-install'
gem 'cocoapods'
gem 'jazzy'


plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
eval_gemfile(plugins_path) if File.exist?(plugins_path)

Para continuar estudando sobre desenvolvimento iOS, temos a live “iOS: Escalando apps e equipes de desenvolvimento” para você assistir:

Conclusão

Como acompanhamos até aqui, utilizar o xcodeproj, que é gerado pelo próprio Xcode, é muito complicado quando se trabalha em uma equipe com muitas pessoas, gerando trabalho na hora do merge. 

O XcodeGen vem pra te auxiliar nisso e deixar os merges mais amigáveis e com menos chances de erro. Uma ótima pedida para equipes mais eficientes!

Gostou do artigo? Deixe seu comentário abaixo e continue acompanhando nossos conteúdos pela nossa central.

Referências

Imagem onde aparece a mão de uma pessoa branca segurando um celular com códigos na tela.
unnamed
Desenvolvedora Especialista Mobile
Apaixonada por tecnologia e por desenvolvimento mobile. Amante de videogame, musica e filmes nas horas vagas.

Artigos relacionados

Este site utiliza cookies para proporcionar uma experiência de navegação melhor. Consulte nossa Política de Privacidade.