CocoaPods Trunk est un service côté serveur de l'écosystème CocoaPods conçu pour publier, héberger et gérer les bibliothèques pod. Trunk a remplacé l'ancien mécanisme de publication via les dépôts GitHub et les forks, en fournissant une infrastructure centralisée avec authentification, gestion de sessions, versionnement et validation avant publication. Les développeurs iOS et macOS utilisent pod trunk push pour envoyer des bibliothèques au registre public.
Points clés
pod trunk register avec confirmation par e-mailpod trunk push passe par la validation, le linting et le téléchargement vers le registrepod trunk me, pod trunk add-owner, pod trunk deprecate pour l'administration des podsCocoaPods Trunk est une infrastructure serveur lancée en 2015 pour la publication centralisée des bibliothèques pod. Avant Trunk, chaque pod était distribué via un dépôt Git : le développeur devait créer un dépôt public, ajouter un fichier podspec et envoyer une Pull Request au dépôt central CocoaPods/Specs. Cette approche nécessitait une modération manuelle et créait des délais lors de la publication des mises à jour.
Trunk a résolu ces problèmes en fournissant une API unifiée pour publier, mettre à jour et gérer les pods. Le service comprend quatre composants clés :
L'architecture de Trunk est basée sur Ruby on Rails avec une base de données PostgreSQL. Le service utilise une API HTTP au format JSON pour toutes les opérations, et le client CLI pod trunk fait partie de la distribution CocoaPods, installé avec la gemme principale cocoapods.
À ce jour, plus de 100 000 pods ont été publiés via Trunk, avec un total de téléchargements dépassant les 50 milliards. Le service traite des milliers de demandes de publication et de mise à jour chaque jour, provenant de développeurs du monde entier.
Avant de publier un pod, vous devez vous inscrire sur Trunk. Le processus consiste en une seule étape — la commande pod trunk register :
pod trunk register your@email.com 'Your Name' --description='MacBook Pro, développement iOS'Après l'exécution de la commande, un lien de confirmation est envoyé à l'e-mail indiqué. En cliquant sur le lien, le compte est activé et un jeton de session est créé, stocké dans le trousseau système (Keychain sur macOS, gnome-keyring ou équivalent sur Linux). Le jeton est automatiquement utilisé pour toutes les opérations pod trunk ultérieures.
Le paramètre --description est facultatif mais recommandé — il aide à identifier la session lors de l'affichage des sessions actives via pod trunk me. Si vous travaillez depuis plusieurs machines (poste de travail, serveur CI), la description permet de distinguer une session d'une autre.
Pour vérifier l'état de l'authentification, utilisez la commande :
pod trunk meLa sortie affiche l'e-mail, le nom, la liste de vos pods (si vous en avez déjà publié) et les sessions actives. Exemple de résultat :
- 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, développement iOSSur les serveurs CI (GitHub Actions, GitLab CI, Jenkins), l'authentification se fait via un jeton passé par la variable d'environnement COCOAPODS_TRUNK_TOKEN. Le jeton peut être obtenu avec la commande :
pod trunk me --token-onlyCe jeton est stocké dans la configuration CI comme variable secrète, et utilisé à l'étape de publication sans nouvelle inscription. Exemple pour GitHub Actions :
env:
COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }}Important : le jeton donne un accès complet à la gestion des pods liés au compte. Ne le publiez jamais dans des dépôts publics et ne le partagez pas avec des tiers. En cas de compromission, le jeton peut être révoqué via pod trunk remove-session ou en supprimant toutes les sessions via le panneau de contrôle du site CocoaPods.
Le fichier podspec (.podspec ou .podspec.json) est le manifeste de la bibliothèque contenant les métadonnées, les dépendances, les informations sur les plateformes et le code source. Trunk utilise ce fichier pour la validation et l'enregistrement du pod. Un podspec minimal pour la publication ressemble à ceci :
Pod::Spec.new do |s|
s.name = 'MyLibrary'
s.version = '0.1.0'
s.summary = 'Brève description de la bibliothèque'
s.description = 'Description détaillée avec explication des fonctionnalités'
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'
endChamps clés du podspec :
MAJOR.MINOR.PATCH. Trunk n'accepte pas la republication d'une même version — il faut incrémenter le numéro.MIT, Apache-2.0, BSD ou une autre licence open source.Avant la publication, vérifiez la validité du podspec avec le linter :
pod lib lint MyLibrary.podspecLe linter vérifie la syntaxe, les champs obligatoires, l'exactitude des chemins de fichiers et la résolubilité des dépendances. Si des sources privées sont utilisées lors du linting, le flag --sources est ajouté. Pour ignorer le téléchargement réseau (vérification locale uniquement), le flag --local-only est utilisé.
La commande principale pour publier un pod est pod trunk push. Elle envoie le fichier podspec au serveur Trunk, où il subit une validation complète et est enregistré dans le registre public. Syntaxe :
pod trunk push MyLibrary.podspecLe flag --allow-warnings autorise la publication en présence d'avertissements. Par défaut, tout avertissement bloque la publication. Si votre bibliothèque a des avertissements connus qui n'affectent pas la fonctionnalité, vous pouvez utiliser ce flag. Important : les erreurs bloquent toujours la publication, indépendamment des flags.
Le flag --synchronous rend la requête synchrone — le terminal attend la fin de la validation côté serveur. Par défaut, la commande reprend la main immédiatement après l'envoi, et le serveur traite la publication de manière asynchrone. Le mode synchrone est utile en CI/CD lorsque l'étape suivante du pipeline dépend du succès de la publication.
Le flag --skip-import-validation ignore la vérification de l'import de la bibliothèque dans un projet de test. Cela accélère la publication mais ne garantit pas que la bibliothèque compile réellement. Utilisez ce flag uniquement si vous êtes sûr de la validité de la compilation.
Exemple de publication avec des options typiques :
pod trunk push MyLibrary.podspec \
--allow-warnings \
--synchronous \
--skip-import-validationAprès une publication réussie, Trunk retourne un JSON avec les détails :
Congrats
MyLibrary (0.1.0) successfully published
Pod URL: https://cocoapods.org/pods/MyLibraryLa bibliothèque devient disponible pour installation via Podfile dans tout projet iOS ou macOS. Normalement, l'index de recherche CocoaPods est mis à jour en quelques minutes, mais dans de rares cas, l'indexation peut prendre jusqu'à une heure.
Limitation importante : une version de pod publiée ne peut pas être supprimée. Cela évite de casser les projets qui utilisent déjà cette version. Si la publication était erronée, vous pouvez publier la version suivante avec la correction, mais le retour en arrière est impossible. L'exception est pod trunk delete, disponible uniquement pour le personnel de CocoaPods et utilisé dans des cas extrêmes (violation de licence, code malveillant).
CocoaPods Trunk fournit plusieurs commandes pour administrer les pods publiés :
Pour transférer les droits de publication d'un pod à un autre développeur, utilisez la commande :
pod trunk add-owner MyLibrary developer@email.comAprès exécution, le nouveau propriétaire obtient un accès complet à la gestion du pod : publication de nouvelles versions, ajout et suppression d'autres propriétaires, marquage du pod comme obsolète. Tout utilisateur enregistré de Trunk peut être propriétaire — l'inscription préalable est obligatoire.
Si un développeur a quitté le projet ou ne doit plus avoir accès au pod :
pod trunk remove-owner MyLibrary developer@email.comSeul un propriétaire actuel peut supprimer un propriétaire. On ne peut pas supprimer le dernier propriétaire d'un pod — il faut d'abord en ajouter un nouveau. Cela évite qu'un pod devienne sans propriétaire et soit abandonné.
Si la bibliothèque n'est plus maintenue, vous pouvez la marquer comme obsolète (deprecated). Cela ne supprime pas le pod du registre, mais ajoute un avertissement aux utilisateurs lors de l'installation :
pod trunk deprecate MyLibraryOptionnellement, vous pouvez spécifier un pod de remplacement :
pod trunk deprecate MyLibrary --in-favor-of=NewLibraryLors de l'installation d'un pod obsolète, CocoaPods affiche un avertissement dans le terminal et recommande de passer au remplacement spécifié. C'est la manière correcte de mettre fin au support d'une bibliothèque sans casser les compilations de projets existants.
Les informations du pod sont disponibles via la commande pod trunk info :
pod trunk info MyLibraryLa commande affiche toutes les versions du pod, les dates de publication, la liste des propriétaires et le statut (actif/obsolète). Pour voir les détails d'une version spécifique, utilisez pod spec cat MyLibrary 0.1.0.
Lorsqu'ils travaillent avec Trunk, les développeurs rencontrent souvent des erreurs typiques. Passons en revue les plus courantes :
Symptôme : [!] Authentication failed. You need to register a session first.
Cause : Jeton de session manquant ou expiré. Les jetons ont une durée de validité limitée (30 jours sans activité par défaut).
Solution : Réexécutez pod trunk register your@email.com 'Your Name'. Si vous utilisez CI, vérifiez que la variable d'environnement COCOAPODS_TRUNK_TOKEN est à jour et générez un nouveau jeton si nécessaire.
Symptôme : [!] You have already pushed version 0.1.0 for MyLibrary.
Cause : Tentative de republication d'une version existante. Trunk ne permet pas d'écraser les versions.
Solution : Incrémentez la version dans le podspec conformément au versionnement sémantique. Si vous avez fait une erreur dans le podspec, publiez la version suivante avec la correction.
Symptôme : [!] The spec did not pass validation. ERROR | [iOS] file patterns: Source files did not match any file.
Cause : Chemin incorrect vers les fichiers sources dans le champ source_files.
Solution : Vérifiez les chemins dans le podspec, exécutez pod lib lint localement jusqu'à résolution de toutes les erreurs, puis répétez la publication. Utilisez des motifs glob : Classes/**/*.{h,m}, Sources/MyLibrary/**/*.swift.
Symptôme : [!] Connection to trunk.cocoapods.org failed. Timeout.
Cause : Problèmes réseau ou indisponibilité temporaire du serveur Trunk.
Solution : Vérifiez la disponibilité du serveur : curl -I https://trunk.cocoapods.org. Si le serveur répond, répétez la commande dans quelques minutes. Votre IP peut être bloquée — essayez depuis une autre connexion ou via un VPN.
Symptôme : [!] You do not have permission to push to MyLibrary.
Cause : Vous n'êtes pas le propriétaire du pod. Cela se produit si quelqu'un a déjà enregistré un pod avec ce nom.
Solution : Contactez le propriétaire actuel du pod (identifiez-le via pod trunk info MyLibrary) et demandez-lui de vous ajouter via pod trunk add-owner. Si le nom du pod est pris, envisagez un nom alternatif.
Questions fréquentes
L'ancienne méthode nécessitait une Pull Request manuelle vers le dépôt CocoaPods/Specs. Trunk automatise le processus : vous exécutez une seule commande pod trunk push, et le serveur valide le podspec, l'ajoute au registre et met à jour l'index de recherche. Trunk a également ajouté la gestion d'accès (propriétaires multiples), les jetons de session et le stockage centralisé des métadonnées.
C'est impossible — Trunk interdit la suppression des versions publiées pour préserver l'intégrité des dépendances. Si une version contient une erreur critique, publiez une nouvelle version avec la correction et marquez la version problématique comme obsolète via pod trunk deprecate. La suppression complète n'est disponible que pour les administrateurs CocoaPods dans des cas exceptionnels.
Non, le champ s.author doit contenir un e-mail. Trunk l'utilise pour lier le pod au compte du propriétaire. L'adresse doit correspondre à l'e-mail utilisé lors de pod trunk register. Si l'e-mail dans le podspec est différent, la publication sera refusée.
Normalement, le pod apparaît dans la recherche CocoaPods en 5 à 15 minutes. Dans de rares cas, l'indexation peut prendre jusqu'à une heure. Cependant, le pod est disponible pour installation via Podfile immédiatement après une réponse réussie de Trunk — il suffit de spécifier la version exacte ou la plage dans le Podfile.
Si vous avez une session active (jeton non expiré), changez votre e-mail via pod trunk register new@email.com — le nouvel enregistrement liera les pods à la nouvelle adresse. Si la session a expiré, contactez le support CocoaPods via GitHub Issues. La preuve de propriété du pod peut être la capacité à créer un commit dans le dépôt Git du pod.
Résumé
pod trunk register avec confirmation par e-mail et stockage automatique du jeton de sessionpod trunk push passe par une validation côté serveur ; une fois publiée, une version ne peut pas être suppriméepod trunk add-owner et pod trunk remove-ownerCOCOAPODS_TRUNK_TOKEN pour la publication automatisée dans les pipelinesNous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi