Estou desenvolvendo o iOS há alguns meses e acabei de conhecer a promissora biblioteca CocoaPods para gerenciamento de dependências.
Eu tentei em um projeto pessoal: adicionei uma dependência do Kiwi ao meu Podfile, executei pod install CocoaPodsTest.xcodeproj
e pronto , funcionou muito bem.
A única coisa que me resta a perguntar é: o que eu faço check-in e o que eu ignoro para o controle de versão? Parece óbvio que desejo fazer o check-in no próprio Podfile e, provavelmente, no arquivo .xcworkspace; mas ignoro o diretório Pods /? Existem outros arquivos que serão gerados no caminho (quando adiciono outras dependências) que também devo adicionar ao meu .gitignore?
fonte
Podfile.lock
: é chamado pelos Cocoapods como recomendado para estar sob controle de versão.Eu comprometo meu diretório de pods. Não concordo que o diretório Pods seja um artefato de construção. Na verdade, eu diria que definitivamente não é. Faz parte da fonte do seu aplicativo: não será construído sem ele!
É mais fácil pensar no CocoaPods como uma ferramenta de desenvolvedor, em vez de uma ferramenta de construção. Ele não cria seu projeto, simplesmente clona e instala suas dependências para você. Não deve ser necessário ter o CocoaPods instalado para poder simplesmente construir seu projeto.
Ao tornar o CocoaPods uma dependência de sua compilação, agora você precisa garantir que ele esteja disponível em qualquer lugar que você precise para criar seu projeto ... um administrador de equipe precisa, seu servidor de CI precisa. Como regra, você sempre deve poder clonar seu repositório de origem e criar sem nenhum esforço adicional.
Não comprometer o diretório Pods também cria uma enorme dor de cabeça se você alternar frequentemente as ramificações. Agora você precisa executar a instalação do pod toda vez que alternar ramificações para garantir que suas dependências estejam corretas. Isso pode ser menos problemático, pois suas dependências se estabilizam, mas no início de um projeto, esse é um grande sumidouro de tempo.
Então, o que eu ignoro? Nada. Podfile, o arquivo de bloqueio e o diretório Pods são confirmados. Confie em mim, você vai economizar muito aborrecimento. Quais são os contras? Um repo um pouco maior? Não é o fim do mundo.
fonte
Pods
diretório causará dor, ao fazer o check-in também vem com seu próprio pacote de problemas. por exemplo, um desenvolvedor esbarra em uma versão de uma dependênciaPodfile
sem lembrar de verificar as fontes atualizadas nos Pods. Lei de Murphy.pod install
toda vez que você muda de filial, você precisa de precioso ... DEZENAS de segundos - mas elimina completamente essa classe de problemas.It won't build without it!
Você pode muito bem comprometer XCode tambémEu recomendo usar o gitignore Objective-C do GitHub . Em detalhes, as melhores práticas são:
Podfile
deve sempre estar sob controle de origem.Podfile.lock
deve sempre estar sob controle de origem.:path
opção deve ser mantido sob controle de origem../Pods
pasta pode ser mantida sob controle de origem.Para mais informações, consulte o guia oficial .
fonte: sou membro da equipe principal do CocoaPods, como @alloy
Embora a pasta Pods seja um artefato de construção, há alguns motivos que você pode considerar ao decidir se deseja mantê-la sob controle de origem:
:head
as:git
opções e atualmente não estão usando os commits armazenados noPodfile.lock
).fonte
arquivo .gitignore
Nenhuma resposta realmente oferece uma
.gitignore
, então aqui estão dois sabores.Verificando no diretório Pods ( Benefícios )
O git amigável para Xcode / iOS ignora, pulando arquivos de sistema Mac OS, Xcode, builds, outros repositórios e backups.
.gitignore:
Ignorando o diretório Pods ( Benefícios )
.gitignore: (anexar à lista anterior)
Se
Pods
não houver check-in, vocêPodfile
provavelmente deverá solicitar números de versão explícitos para cada Cocoapod. Discussão sobre Cocoapods.org aqui .fonte
Eu geralmente trabalho em aplicativos de clientes. Nesse caso, também adiciono o diretório Pods ao repositório, para garantir que a qualquer momento qualquer desenvolvedor possa fazer um checkout, criar e executar.
Se fosse um aplicativo próprio, provavelmente excluiria o diretório Pods até não trabalhar nele por um tempo.
Na verdade, devo concluir que posso não ser a melhor pessoa para responder à sua pergunta, em comparação com as opiniões de usuários puros :) Vou twittar sobre essa pergunta em https://twitter.com/CocoaPodsOrg .
fonte
Eu verifico tudo. (
Pods/
ePodfile.lock
.)Quero poder clonar o repositório e saber que tudo funcionará como na última vez que usei o aplicativo.
Prefiro coisas do fornecedor do que correr o risco de ter resultados diferentes que podem ser causados por uma versão diferente da gema ou por alguém reescrever o histórico no repositório do Pod, etc.
fonte
A resposta para isso é fornecida diretamente nos documentos do Cocoapod. Você pode consultar " http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control "
fonte
Estou no campo de desenvolvedores que não fazem check-in de bibliotecas, assumindo que temos uma boa cópia disponível em outro local. Portanto, no meu .gitignore, incluo as seguintes linhas específicas para o CocoaPods:
Então, garanto que temos uma cópia das bibliotecas em um local seguro. Em vez de (mis-) usar o repositório de código de um projeto para armazenar dependências (compiladas ou não), acho que a melhor maneira de fazer isso é arquivar compilações. Se você usar um servidor de IC para suas construções (como Jenkins), poderá arquivar permanentemente todas as construções importantes para você. Se você criar todas as suas construções de produção no Xcode local, crie o arquivo do seu projeto para todas as construções que você precisa manter. Algo como: 1. Produto -> Arquivo
Distribua ... Envie para a App Store do iOS / Salvar para empresa ou Implantação ad-hoc / o que você tem
Revele a pasta do seu projeto no Finder
Clique com o botão direito e Comprima "WhateverProject"
Isso fornece uma imagem como construída de todo o projeto, incluindo as configurações completas do projeto e da área de trabalho usadas para criar o aplicativo, bem como distribuições binárias (como Sparkle, SDKs proprietários como TestFlight etc.), independentemente de eles usarem ou não o CocoaPods.
Atualização: Eu mudei de idéia sobre isso e agora confirmo o
Podfile.lock
controle de origem. No entanto, ainda acredito que os próprios pods são artefatos de construção e devem ser gerenciados como tal fora do controle de origem, através de outro método, como o servidor de IC ou um processo de arquivamento, como descrevi acima.fonte
Podfile.lock
: docs.cocoapods.org/guides/working_with_teams.htmlPodfile.lock
cria caminhos para os pods locais, eu não tinha pensado em adicioná-lo ao controle de versão. No entanto, agora que penso sobre isso, não é diferente das mudanças locais em que faço,Podfile
mas nunca comprometo. Obrigado por apontar isso.Podfile.lock
arquivo.Prefiro confirmar o
Pods
diretório juntamente comPodfile
ePodfile.lock
garantir que alguém da minha equipe possa fazer o checkout da fonte a qualquer momento e não precise se preocupar com nada ou fazer outras coisas para fazê-la funcionar.Isso também ajuda em um cenário em que você corrigiu um bug em um dos pods ou modificou algum comportamento conforme suas necessidades, mas essas alterações não estarão disponíveis em outras máquinas se não forem confirmadas.
E para ignorar diretórios desnecessários:
fonte
Devo dizer que sou fã de comprometer Pods no repositório. Seguir um link já mencionado dará a você um bom arquivo .gitignore para atualizar seus projetos Xcode para iOS para permitir Pods, mas também para excluí-los facilmente, se assim o desejar: https://github.com/github/gitignore/ blob / master / Objective-C.gitignore
Meu raciocínio para ser um fã de adicionar Pods ao repositório é por um motivo fundamental que ninguém parece entender: o que acontece se uma biblioteca da qual nosso projeto é tão dependente é subitamente removida da Web?
NB ... observe que a ramificação 'master' para desenvolvimento é apenas um exemplo; obviamente, as ramificações 'master' nos sistemas de controle de versão devem ser mantidas limpas e implantáveis / montáveis a qualquer momento
Eu acho que disso, instantâneos nos repositórios de código são certamente melhores do que serem rigorosos no tamanho do repositório. E, como já mencionado, o arquivo podfile.lock - enquanto a versão controlada fornece um bom histórico de suas versões do Pod.
No final do dia, se você tiver um prazo final apertado, um orçamento apertado, o tempo é essencial - precisamos ser o mais engenhosos possível e não perder tempo com ideologias estritas, e usar um conjunto de ferramentas para trabalhar em conjunto - tornar nossa vida mais fácil e mais eficiente.
fonte
No final, depende de você a abordagem adotada.
Isto é o que a equipe Cocoapods pensa sobre isso:
Pessoalmente, gostaria de manter os Pods fora, como node_modules se eu estivesse usando o Node ou bower_components se estivesse usando o Bower . Isso se aplica a quase todos os Dependency Manager existentes, e também é a filosofia por trás dos submódulos git .
No entanto, às vezes você pode querer ter certeza do estado da arte de uma certa dependência; dessa maneira, você é portador da própria dependência do projeto. Obviamente, existem várias desvantagens que se aplicam se você fizer isso, mas as preocupações não se aplicam apenas aos Cocoapods, elas se aplicam a qualquer Dependency Manager existente.
Abaixo, há uma boa lista de prós / contras da equipe Cocoapods e o texto completo da citação mencionada anteriormente.
Equipe Cocoapods: Devo verificar o diretório Pods no controle de origem?
fonte
Depende, pessoalmente:
Por que os pods devem fazer parte do repositório (sob controle de origem) e não devem ser ignorados
pods.xcodeproj
as configurações também fazem parte do controle de origem. Isso significa, por exemplo, se você possui o projetoswift 4
, mas alguns pods precisam estarswift 3.2
porque ainda não foram atualizados, essas configurações serão salvas. Caso contrário, quem clonou o repositório acabaria com erros.pod install
, o contrário não pode ser feito.Alguns contras: repositório maior, diferenças confusas (principalmente para membros da equipe), potencialmente mais conflitos.
fonte
Para mim, a maior preocupação é proteger sua fonte no futuro. Se você planeja que seu projeto dure por um tempo e o CocoaPods desapareça ou a fonte de um dos pods diminua, você estará completamente sem sorte se tentar criar novas informações a partir de um arquivo.
Isso pode ser mitigado com arquivamentos periódicos de fontes completas.
fonte
Verifique nos Pods.
Eu acho que isso deve ser um princípio de desenvolvimento de software
Por quê?
CocoaPods ou quaisquer outras bibliotecas externas podem mudar, o que pode quebrar as coisas. Ou eles podem se mover ou ser renomeados ou completamente removidos. Você não pode confiar na internet para guardar coisas para você. Seu laptop pode ter morrido e há um erro crítico na produção que precisa ser corrigido. O desenvolvedor principal pode ser atropelado por um ônibus e seu substituto deve ser iniciado com pressa. E gostaria que o último fosse um exemplo teórico, mas realmente aconteceu em uma startup em que eu estava. DESCANSE EM PAZ.
Agora, realisticamente, você não pode realmente verificar TODAS as dependências. Você não pode fazer check-in de uma imagem da máquina que você usou para criar builds; você não pode verificar a versão exata do compilador. E assim por diante. Existem limites realistas. Mas verifique tudo o que puder - não fazer isso apenas torna sua vida mais difícil. E nós não queremos isso.
Palavra final: os pods não são artefatos de construção. Artefatos de construção são o que é gerado a partir de suas construções. Sua compilação usa Pods, não os gera. Não sei ao certo por que isso precisa ser debatido.
fonte
Prós de não fazer check-in
Pods/
no controle de versão (em ordem subjetiva de importância):pod install
pode ocultar as alterações.Podfile
e oPods/
diretório são encontradas mais rapidamente entre os colegas de equipe. Se você fizer o check-inPods/
e, por exemplo, atualizar uma versão noPodfile
, mas esquecer de executarpod install
ou fazer o check-in das alteraçõesPods/
, será muito mais difícil perceber a origem da discrepância. SePods/
não houver check-in, você sempre precisará executar depod install
qualquer maneira.JAR
arquivos.venv/
(ambientes virtuais) enode_modules/
nunca são incluídos no controle de versão. Se fôssemos completamente independentes da questão, não fazer o check-inPods
seria o padrão com base no precedente.Contras de não fazer check-in
Pods/
pod install
ao alternar ramificações ou reverter confirmações.pod install
.pod install
, e a fonte dos pods deve estar disponível.Em resumo, não incluir o
Pods
diretório é um guardrail contra mais práticas ruins. A inclusão doPods
diretório facilita a execução do projeto. Eu prefiro o primeiro do que o último. Você não precisará consultar cada nova pessoa em um projeto sobre "o que não fazer" se não houver possibilidade de cometer certos erros em primeiro lugar. Também gosto da ideia de ter um controle de versão separado, para oPods
qual alivia os Contras.fonte
Em teoria, você deve verificar no diretório Pods. Na prática, nem sempre isso vai funcionar. Muitos pods excedem bem o limite de tamanho dos arquivos do github; portanto, se você estiver usando o github, terá problemas ao verificar o diretório Pods.
fonte
Embora a organização Cocoapods nos incentive a rastrear o
Pods/
diretório, eles dizem que cabe aos desenvolvedores decidir se devem ou não fazê-lo com base nesses prós e contras: http://guides.cocoapods.org/using/using-cocoapods.html # should-i-check-the-pods-directory-in-source-controlPessoalmente, geralmente acompanho a
Pods/
pasta apenas para projetos nos quais não trabalharei mais por um tempo. Dessa forma, qualquer desenvolvedor pode buscá-lo rapidamente e continuar o trabalho usando a versão adequada dos cocoapods.Por outro lado, acho que o histórico de consolidação fica mais limpo e é mais fácil mesclar o código e revisar o código de outra pessoa quando você não está rastreando a
Pods/
pasta. Normalmente, defino a versão da biblioteca cocoapod quando a instalo para garantir que alguém possa instalar o projeto usando as mesmas versões que eu.Além disso, quando o
Pods/
diretório está sendo rastreado, todos os desenvolvedores precisam usar a mesma versão do Cocoapods para impedir que ele altere dezenas de arquivos toda vez que executamospod install
para adicionar / remover um pod.Conclusão : quando você acompanha a
Pods/
pasta, é mais fácil escolher o projeto. Quando você não o acompanha, é mais fácil melhorar.fonte
Parece que uma boa maneira de estruturar isso seria ter o diretório "Pods" como um submódulo git / projeto separado, eis o porquê.
Ter pods no repositório do projeto, ao trabalhar com vários desenvolvedores, pode causar diferenças MUITO GRANDES nas solicitações pull, onde é quase impossível ver o trabalho real que foi alterado pelas pessoas (pense em várias centenas a milhares de arquivos alterados para bibliotecas e apenas um poucos mudaram no projeto real).
Vejo a questão de não comprometer nada com o git, como a pessoa que possui a biblioteca pode derrubá-la a qualquer momento e você é essencialmente SOL, isso também resolve isso.
fonte
A decisão de verificar ou não a pasta Pods depende de você, pois os fluxos de trabalho variam de projeto para projeto. Recomendamos que você mantenha o diretório Pods sob controle de origem e não o adicione ao seu .gitignore. Mas, finalmente, esta decisão é sua:
Benefícios da verificação no diretório Pods
Benefícios de ignorar o diretório Pods
fonte