Obtener el último código de una dependencia de CocoaPods que apunta a una twig

Esta pregunta se trata de cómo get el último código para las dependencies administradas por CocoaPods durante el desarrollo, es decir, sin hacer todo el baile "push a new podspec".

Preparar

Digamos que tenemos tres proyectos A , B y C Las dependencies son tales que A depende de B , y B depende de C Cada proyecto reside en su propio repository de Git.

Pensamos que usaríamos una versión menor ficticia para identificar el estado actual del código. Las podspecs residen en nuestro propio repository.

 # A/Podfile ... pod 'B', '1.dev' # B/Podfile ... pod 'C', '1.dev' # B/B.podspec Pod::Spec.new do |s| s.name = 'B' s.version = '1.dev' ... s.dependency = 'C', '1.dev' end # C/C.podspec Pod::Spec.new do |s| s.name = 'C' s.version = '1.dev' ... end 

El problema

Empujamos un nuevo compromiso a (la twig principal de) C Esperamos

 A$ pod update 

para recuperar el cambio Esto no sucede.

Enfoques

  1. Siempre que (sepamos) desee volver a extraer las dependencies, haga lo siguiente:

     A$ rm -rf Pods/ Podfile.lock A$ pod cache clean --all A$ pod install 

    Esto definitivamente obtiene el último código. Sin embargo, es una maza que no es conveniente ni eficiente de hacer después de cada extracción en A , empujar en B o C , o alternar entre twigs en A

  2. Para mantenernos cerca de la configuration, tendríamos que crear un nuevo set de podspecs y Podfiles después de cada set (significativo) de confirmaciones en una twig principal (es decir, una combinación de una twig de características), todo con una nueva versión 1.xy ( y un número de compilation o algo así); empujar las podspecs; y ejecutar la pod update en A y B

    Si bien esto puede ser factible en una configuration de CI (que desafortunadamente aún no tenemos), es un trabajo prohibitivo hacerlo manualmente. Los ganchos Git pueden ser una solución.

  3. En twigs sin versión, haz

     # A/Podfile ... pod 'A', :git => "...", :branch => "master" 

    Es decir, eludir el repository de podspec. Desafortunadamente, esto no funcionará aquí porque B.podspec inspeccionará B.podspec y encontrará su dependencia C , que no podemos especificar de manera similar. Además, la pod update siempre se vuelve a instalar, sin importar si hubo nuevos commits.

Pregunta

¿Existe una buena forma (de bajo mantenimiento) de rastrear sucursales con CocoaPods? Si no, ¿qué son alternativas?

Una posible solución es usar pod locales.

Arquitectura para la muestra:

 SomeWhere/BigFolder -- ProjectAWithItsPodSpecFiles -- ProjectBWithItsPodSpecFiles -- ProjectCWithItsPodSpecFiles 

De esta manera en tu PodFile A, haces:

 pod 'MyCustomPodB', :path => '../FolderPodB' pod 'MyCustomPodC', :path => '../FolderPodC' 

Esto agrega la posibilidad de modificar las classs de tu pod sin pedir una pod update / git pull y tampoco pedir que "MyFileInMyPod" se bloquee para su edición y es posible que no puedas save tus cambios. ¿Quieres desbloquearlo? de XCode cada vez.

¿Cómo le decimos a todos que lo hagan, es decir, mantener la architecture de las carpetas?

¡Usando Repo , herramienta de Google!

¿Qué es esta herramienta en unas pocas líneas?
Puede extraer de varios repositorys de git al mismo time, manteniendo un trabajo sincronizado.
Tiene un file manifest.xml donde especifica los repositorys, las twigs y la ruta local (para la architecture local). Aquí hay un tutorial . Si está utilizando repositorys privados, le sugiero que use un HostAlias con keys SSH.

Mi compañero de trabajo sigue usando Repo , realmente no. Sigo tirando / empujando a cada uno de ellos uno por uno usando SourceTree.app , utilicé Repo solo para el "iniciador" y eso me creó toda mi architecture local.

En nuestro propio proyecto:

 Projects/MainApp Projects/CoreClasses Projects/Custo, Like Colors, etc. Projects/OtherModule 

Yo, la mayoría de las veces, trabajo en MainApp y necesito modificar CoreClasses sin ningún problema de esta manera.

Muestra de nuestro Manifest.xml (en otro repository privado donde casi solo hay un file):

 <?xml version="1.0" encoding="UTF-8"?> <manifest> <remote name="remoteName" fetch="ssh://git@ourCommonAlias/RestOfTheGitPathExceptTheLastComponent"/> <default revision="masterBranchIsToSetByDefaultIfNeeded" remote="bitbucket" sync-j="4" /> <project name="MainApp.git" remote="remoteName" path="BigFolder/MainApp"/> <!-- The name is the last component of the repository, the path the local path, the remote, the "start of the ssh give previously --> <project name="CoreClasses.git" remote="remoteName" path="BigFolder/CoreClasses"/> <project name="Custo.git" remote="remoteName" path="BigFolder/Custo" revision="someBranchIfNeededThere"/> <project name="OtherModule.git" remote="remoteName" path="BigFolder/OtherModule"/> </manifest>