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.