CocoaPods Trunk es un servicio del lado del servidor del ecosistema CocoaPods diseñado para publicar, alojar y gestionar bibliotecas pod. Trunk reemplazó el mecanismo obsoleto de publicación mediante repositorios de GitHub y forks, proporcionando una infraestructura centralizada con autenticación, gestión de sesiones, control de versiones y validación antes de la publicación. Los desarrolladores de iOS y macOS usan pod trunk push para enviar bibliotecas al registro público.
Puntos clave
pod trunk register con confirmación por correo electrónicopod trunk push pasa por validación, linting y carga al registropod trunk me, pod trunk add-owner, pod trunk deprecate para administrar podsCocoaPods Trunk es una infraestructura de servidor lanzada en 2015 para la publicación centralizada de bibliotecas pod. Antes de Trunk, cada pod se distribuía a través de un repositorio Git: el desarrollador debía crear un repositorio público, añadir un archivo podspec y enviar un Pull Request al repositorio central CocoaPods/Specs. Este enfoque requería moderación manual y generaba retrasos al publicar actualizaciones.
Trunk resolvió estos problemas proporcionando una API unificada para publicar, actualizar y gestionar pods. El servicio incluye cuatro componentes clave:
La arquitectura de Trunk está basada en Ruby on Rails con base de datos PostgreSQL. El servicio utiliza API HTTP con formato JSON para todas las operaciones, y el cliente CLI pod trunk es parte de la distribución de CocoaPods, instalado junto con la gema principal cocoapods.
Hasta la fecha, se han publicado más de 100 000 pods a través de Trunk, con un total de descargas que supera los 50 mil millones. El servicio procesa miles de solicitudes de publicación y actualización diariamente de desarrolladores de todo el mundo.
Antes de publicar un pod, debe registrarse en Trunk. El proceso consiste en un solo paso: el comando pod trunk register:
pod trunk register your@email.com 'Your Name' --description='MacBook Pro, desarrollo iOS'Después de ejecutar el comando, se envía un enlace de confirmación al correo electrónico indicado. Al hacer clic en el enlace se activa la cuenta y se crea un token de sesión que se almacena en el llavero del sistema (Keychain en macOS, gnome-keyring o equivalente en Linux). El token se usa automáticamente en todas las operaciones posteriores de pod trunk.
El parámetro --description es opcional pero recomendado: ayuda a identificar la sesión al ver las sesiones activas mediante pod trunk me. Si trabaja desde varios equipos (estación de trabajo, servidor CI), la descripción permite distinguir una sesión de otra.
Para verificar el estado de la autenticación, use el comando:
pod trunk meLa salida muestra el correo electrónico, el nombre, la lista de sus pods (si ya ha publicado) y las sesiones activas. Ejemplo de resultado:
- Name: Your Name
- Email: your@email.com
- Since: 2024-03-15 10:30 UTC
- Pods:
- MyLibrary
- AnotherPod
- Sessions:
- 2024-03-15 10:30 UTC - MacBook Pro, desarrollo iOSEn servidores CI (GitHub Actions, GitLab CI, Jenkins), la autenticación se realiza mediante un token pasado a través de la variable de entorno COCOAPODS_TRUNK_TOKEN. El token se obtiene con el comando:
pod trunk me --token-onlyEste token se guarda en la configuración de CI como variable secreta y se utiliza en el paso de publicación sin necesidad de registro repetido. Ejemplo para GitHub Actions:
env:
COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }}Importante: el token otorga acceso completo a la gestión de los pods vinculados a la cuenta. Nunca lo publique en repositorios públicos ni lo comparta con terceros. Si se ve comprometido, el token se puede revocar mediante pod trunk remove-session o eliminando todas las sesiones a través del panel de control del sitio web de CocoaPods.
El archivo podspec (.podspec o .podspec.json) es el manifiesto de la biblioteca que contiene metadatos, dependencias, información sobre plataformas y código fuente. Trunk utiliza este archivo para la validación y el registro del pod. Un podspec mínimo para publicar tiene este aspecto:
Pod::Spec.new do |s|
s.name = 'MyLibrary'
s.version = '0.1.0'
s.summary = 'Breve descripción de la biblioteca'
s.description = 'Descripción detallada con explicación de las características'
s.homepage = 'https://github.com/username/MyLibrary'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'Your Name' => 'your@email.com' }
s.source = { :git => 'https://github.com/username/MyLibrary.git', :tag => s.version.to_s }
s.source_files = 'Sources/**/*.{swift,h,m}'
s.platform = :ios, '12.0'
s.swift_version = '5.7'
endCampos clave del podspec:
MAJOR.MINOR.PATCH. Trunk no acepta la republicación de la misma versión: debe incrementar el número.MIT, Apache-2.0, BSD u otra licencia de código abierto.Antes de publicar, verifique la corrección del podspec con el linter:
pod lib lint MyLibrary.podspecEl linter comprueba la sintaxis, los campos obligatorios, la corrección de las rutas a los archivos y la resolubilidad de las dependencias. Si durante el linting se utilizan fuentes privadas, se añade el flag --sources. Para omitir la descarga de red (solo comprobación local), se usa el flag --local-only.
El comando principal para publicar un pod es pod trunk push. Envía el archivo podspec al servidor Trunk, donde se somete a una validación completa y se registra en el registro público. Sintaxis:
pod trunk push MyLibrary.podspecEl flag --allow-warnings permite la publicación en presencia de advertencias. Por defecto, cualquier advertencia bloquea la publicación. Si la biblioteca tiene advertencias conocidas que no afectan la funcionalidad, puede usar este flag. Importante: los errores siempre bloquean la publicación, independientemente de los flags.
El flag --synchronous hace que la solicitud sea síncrona: el terminal espera a que se complete la validación en el servidor. Por defecto, el comando devuelve el control inmediatamente después del envío, y el servidor procesa la publicación de forma asíncrona. El modo síncrono es útil en CI/CD cuando el siguiente paso del pipeline depende del éxito de la publicación.
El flag --skip-import-validation omite la comprobación de importación de la biblioteca en un proyecto de prueba. Esto acelera la publicación pero no garantiza que la biblioteca realmente compile. Use este flag solo si está seguro de la corrección de la compilación.
Ejemplo de publicación con opciones típicas:
pod trunk push MyLibrary.podspec \
--allow-warnings \
--synchronous \
--skip-import-validationDespués de una publicación exitosa, Trunk devuelve un JSON con los detalles:
Congrats
MyLibrary (0.1.0) successfully published
Pod URL: https://cocoapods.org/pods/MyLibraryLa biblioteca está disponible para su instalación mediante Podfile en cualquier proyecto de iOS o macOS. Normalmente, los datos en el índice de búsqueda de CocoaPods se actualizan en unos minutos, pero en casos excepcionales la indexación puede tardar hasta una hora.
Limitación importante: una versión de pod publicada no se puede eliminar. Esto se hace para evitar romper proyectos que ya usan esa versión. Si la publicación fue errónea, puede publicar la siguiente versión con la corrección, pero la reversión es imposible. La excepción es pod trunk delete, disponible solo para el personal de CocoaPods y se aplica en casos extremos (violación de licencia, código malicioso).
CocoaPods Trunk proporciona varios comandos para administrar los pods publicados:
Para transferir los derechos de publicación de un pod a otro desarrollador, use el comando:
pod trunk add-owner MyLibrary developer@email.comTras la ejecución, el nuevo propietario obtiene acceso completo a la gestión del pod: publicación de nuevas versiones, añadir y eliminar otros propietarios, marcar el pod como obsoleto. Puede ser propietario cualquier usuario registrado de Trunk; el registro previo es obligatorio.
Si un desarrollador ha abandonado el proyecto o ya no debe tener acceso al pod:
pod trunk remove-owner MyLibrary developer@email.comSolo un propietario actual puede eliminar a otro propietario. No se puede eliminar al último propietario de un pod: primero debe añadir uno nuevo. Esto evita que un pod se quede sin propietario y se convierta en abandonado.
Si la biblioteca ya no tiene soporte, puede marcarla como obsoleta (deprecated). Esto no elimina el pod del registro, pero añade una advertencia a los usuarios durante la instalación:
pod trunk deprecate MyLibraryOpcionalmente, puede especificar un pod de reemplazo:
pod trunk deprecate MyLibrary --in-favor-of=NewLibraryAl instalar un pod obsoleto, CocoaPods muestra una advertencia en el terminal y recomienda cambiar al reemplazo especificado. Esta es la forma correcta de finalizar el soporte de una biblioteca sin romper las compilaciones de proyectos existentes.
La información del pod está disponible mediante el comando pod trunk info:
pod trunk info MyLibraryEl comando muestra todas las versiones del pod, fechas de publicación, lista de propietarios y estado (activo/obsoleto). Para ver los detalles de una versión específica, use pod spec cat MyLibrary 0.1.0.
Al trabajar con Trunk, los desarrolladores se encuentran a menudo con errores típicos. Veamos los más comunes:
Síntoma: [!] Authentication failed. You need to register a session first.
Causa: Token de sesión ausente o caducado. Los tokens tienen un período de validez limitado (30 días sin actividad por defecto).
Solución: Vuelva a ejecutar pod trunk register your@email.com 'Your Name'. Si usa CI, verifique que la variable de entorno COCOAPODS_TRUNK_TOKEN esté actualizada y genere un nuevo token si es necesario.
Síntoma: [!] You have already pushed version 0.1.0 for MyLibrary.
Causa: Intento de republicación de una versión existente. Trunk no permite sobrescribir versiones.
Solución: Incremente la versión en el podspec según el versionado semántico. Si se equivocó en el podspec, publique la siguiente versión con la corrección.
Síntoma: [!] The spec did not pass validation. ERROR | [iOS] file patterns: Source files did not match any file.
Causa: Ruta incorrecta a los archivos fuente en el campo source_files.
Solución: Verifique las rutas en el podspec, ejecute pod lib lint localmente hasta resolver todos los errores, luego repita la publicación. Use patrones glob: Classes/**/*.{h,m}, Sources/MyLibrary/**/*.swift.
Síntoma: [!] Connection to trunk.cocoapods.org failed. Timeout.
Causa: Problemas de red o indisponibilidad temporal del servidor Trunk.
Solución: Verifique la disponibilidad del servidor: curl -I https://trunk.cocoapods.org. Si el servidor responde, repita el comando en unos minutos. Es posible que su IP esté bloqueada; intente desde otra conexión o mediante VPN.
Síntoma: [!] You do not have permission to push to MyLibrary.
Causa: No es propietario del pod. Esto ocurre si alguien ya registró un pod con ese nombre.
Solución: Póngase en contacto con el propietario actual del pod (puede averiguarlo mediante pod trunk info MyLibrary) y solicite que le añada mediante pod trunk add-owner. Si el nombre del pod está ocupado, considere un nombre alternativo.
Preguntas frecuentes
El método antiguo requería un Pull Request manual al repositorio CocoaPods/Specs. Trunk automatiza el proceso: ejecuta un solo comando pod trunk push, y el servidor valida el podspec, lo añade al registro y actualiza el índice de búsqueda. Trunk también añadió gestión de acceso (múltiples propietarios), tokens de sesión y almacenamiento centralizado de metadatos.
No es posible: Trunk prohíbe eliminar versiones publicadas para mantener la integridad de las dependencias. Si una versión contiene un error crítico, publique una nueva versión con la corrección y marque la versión problemática como obsoleta mediante pod trunk deprecate. La eliminación completa solo está disponible para los administradores de CocoaPods en casos excepcionales.
No, el campo s.author debe incluir un correo electrónico. Trunk lo utiliza para vincular el pod a la cuenta del propietario. La dirección debe coincidir con el correo electrónico usado durante pod trunk register. Si el correo en el podspec es diferente, la publicación será rechazada.
Normalmente, el pod aparece en la búsqueda de CocoaPods en 5–15 minutos. En casos excepcionales, la indexación puede tardar hasta una hora. Sin embargo, el pod está disponible para instalación mediante Podfile inmediatamente después de una respuesta exitosa de Trunk: solo necesita especificar la versión exacta o el rango en el Podfile.
Si tiene una sesión activa (token no caducado), cambie su correo electrónico mediante pod trunk register new@email.com; el nuevo registro vinculará los pods a la nueva dirección. Si la sesión ha caducado, póngase en contacto con el soporte de CocoaPods a través de GitHub Issues. La prueba de propiedad del pod puede ser la capacidad de crear un commit en el repositorio Git del pod.
Resumen
pod trunk register con confirmación por correo electrónico y almacenamiento automático del token de sesiónpod trunk push pasa por validación en el servidor; una vez publicada, una versión no se puede eliminarpod trunk add-owner y pod trunk remove-ownerCOCOAPODS_TRUNK_TOKEN para publicación automatizada en pipelinesDesarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también