CocoaPods Trunk — een serverservice van het CocoaPods-ecosysteem, bedoeld voor het publiceren, hosten en beheren van pod-bibliotheken. Trunk heeft het verouderde publicatiemechanisme via GitHub-repositories en forks vervangen door een gecentraliseerde infrastructuur met authenticatie, sessiebeheer, versionering en validatie voor publicatie. iOS- en macOS-ontwikkelaars gebruiken pod trunk push om bibliotheken naar het openbare register te sturen.
Belangrijkste punten
pod trunk register met e-mailbevestigingpod trunk push doorloopt validatie, linting en upload naar het registerpod trunk me, pod trunk add-owner, pod trunk deprecate voor het beheren van podsCocoaPods Trunk — is een serverinfrastructuur die in 2015 is gelanceerd voor gecentraliseerde publicatie van pod-bibliotheken. Vóór de komst van Trunk werd elke pod via een Git-repository verspreid: een ontwikkelaar moest een openbare repository aanmaken, een podspec-bestand toevoegen en een Pull Request indienen bij de centrale repository CocoaPods/Specs. Deze aanpak vereiste handmatige moderatie en veroorzaakte vertragingen bij het publiceren van updates.
Trunk loste deze problemen op door een uniforme API te bieden voor het publiceren, bijwerken en verwijderen van pods. De service omvat vier kerncomponenten:
De architectuur van Trunk is gebouwd op Ruby on Rails met PostgreSQL-database. De service gebruikt HTTP API met JSON-formaat voor alle bewerkingen, en de CLI-client pod trunk maakt deel uit van de CocoaPods-distributie en wordt samen met de hoofd-gem cocoapods geïnstalleerd.
Momenteel zijn via Trunk meer dan 100.000 pods gepubliceerd, met een totaal aantal downloads van meer dan 50 miljard. Dagelijks verwerkt de service duizenden publicatie- en updateverzoeken van ontwikkelaars over de hele wereld.
Voordat u een pod publiceert, moet u zich registreren bij Trunk. Het proces bestaat uit één stap — het commando pod trunk register:
pod trunk register your@email.com 'Your Name' --description='MacBook Pro, iOS-ontwikkeling'Na het uitvoeren van het commando ontvangt u een e-mail met een bevestigingslink. Door op de link te klikken wordt het account geactiveerd en wordt een sessietoken aangemaakt dat wordt opgeslagen in de systeem-sleutelketen (Keychain op macOS, gnome-keyring of equivalent op Linux). Het token wordt automatisch gebruikt bij alle volgende pod trunk-bewerkingen.
De parameter --description is optioneel maar aanbevolen — het helpt bij het identificeren van een sessie bij het bekijken van actieve sessies via pod trunk me. Als u op meerdere machines werkt (werkstation, CI-server), kunt u met de beschrijving de ene sessie van de andere onderscheiden.
Om de authenticatiestatus te controleren, wordt het volgende commando gebruikt:
pod trunk meDe uitvoer toont het e-mailadres, naam, lijst van uw pods (indien u al hebt gepubliceerd) en actieve sessies. Voorbeeld van de uitvoer:
- 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, iOS-ontwikkelingOp CI-servers (GitHub Actions, GitLab CI, Jenkins) vindt authenticatie plaats via een token dat wordt doorgegeven via de omgevingsvariabele COCOAPODS_TRUNK_TOKEN. Het token kan worden verkregen met het commando:
pod trunk me --token-onlyDit token wordt opgeslagen in de CI-instellingen als een geheime variabele en wordt in de publicatiefase gebruikt zonder opnieuw te registreren. Voorbeeld voor GitHub Actions:
env:
COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }}Belangrijk: het token geeft volledige toegang tot het beheer van aan het account gekoppelde pods. Publiceer het nooit in openbare repositories en geef het niet aan derden. Bij compromittering kan het token worden ingetrokken via pod trunk remove-session of kunnen alle sessies worden verwijderd via het bedieningspaneel op de CocoaPods-website.
Het podspec-bestand (.podspec of .podspec.json) — is het manifest van de bibliotheek met metadata, afhankelijkheden, informatie over platforms en broncode. Trunk gebruikt dit bestand voor validatie en registratie van de pod. Een minimale podspec voor publicatie ziet er als volgt uit:
Pod::Spec.new do |s|
s.name = 'MyLibrary'
s.version = '0.1.0'
s.summary = 'Korte beschrijving van de bibliotheek'
s.description = 'Gedetailleerde beschrijving met uitleg van mogelijkheden'
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'
endBelangrijkste podspec-velden:
MAJOR.MINOR.PATCH. Trunk accepteert geen herpublicatie van dezelfde versie — u moet het nummer verhogen.MIT, Apache-2.0, BSD of een andere open licentie te vermelden.Voor publicatie moet de podspec met een linter worden gecontroleerd:
pod lib lint MyLibrary.podspecDe linter controleert de syntax, aanwezigheid van verplichte velden, correctheid van bestandspaden en oplosbaarheid van afhankelijkheden. Als in het lintingproces privébronnen (private specs) worden gebruikt, wordt de vlag --sources toegevoegd. Om netwerkdownload over te slaan (alleen lokale controle) wordt de vlag --local-only gebruikt.
Het hoofdcommando voor het publiceren van een pod — pod trunk push. Het verzendt het podspec-bestand naar de Trunk-server, waar het volledige validatie ondergaat en wordt geregistreerd in het openbare register. Syntax:
pod trunk push MyLibrary.podspecDe vlag --allow-warnings staat publicatie toe bij aanwezigheid van waarschuwingen. Standaard blokkeren alle waarschuwingen (warnings) de publicatie. Als de bibliotheek bekende waarschuwingen heeft die de functionaliteit niet beïnvloeden, kunt u deze vlag gebruiken. Belangrijk: fouten (errors) blokkeren altijd de publicatie, ongeacht de vlaggen.
De vlag --synchronous maakt het verzoek synchroon — de terminal wacht op voltooiing van de validatie op de server. Standaard retourneert het commando direct de controle na verzending en verwerkt de server de publicatie asynchroon. Synchrone modus is handig in CI/CD wanneer de volgende pipeline-stap afhangt van het succes van de publicatie.
De vlag --skip-import-validation slaat de controle van de import van de bibliotheek in een testproject over. Dit versnelt de publicatie, maar garandeert niet dat de bibliotheek daadwerkelijk compileert. Gebruik deze vlag alleen als u zeker bent van de correctheid van de build.
Voorbeeld van publicatie met typische opties:
pod trunk push MyLibrary.podspec \
--allow-warnings \
--synchronous \
--skip-import-validationNa succesvolle publicatie retourneert Trunk een JSON met details:
Congrats
MyLibrary (0.1.0) successfully published
Pod URL: https://cocoapods.org/pods/MyLibraryDe bibliotheek wordt beschikbaar voor installatie via Podfile van elk iOS- of macOS-project. Gewoonlijk worden de gegevens in de CocoaPods-zoekindex binnen enkele minuten bijgewerkt, maar in zeldzame gevallen kan de indexering tot een uur duren.
Belangrijke beperking: een eenmaal gepubliceerde podversie kan niet worden verwijderd. Dit is om schade te voorkomen aan projecten die deze versie al gebruiken. Als de publicatie met een fout is verlopen, kunt u de volgende versie met een correctie publiceren, maar terugdraaien is onmogelijk. Uitzondering — pod trunk delete, alleen beschikbaar voor CocoaPods-medewerkers en toegepast in extreme gevallen (licentieschending, kwaadaardige code).
CocoaPods Trunk biedt verschillende commando's voor het beheren van gepubliceerde pods:
Om de publicatierechten van een pod aan een andere ontwikkelaar over te dragen, wordt het volgende commando gebruikt:
pod trunk add-owner MyLibrary developer@email.comNa uitvoering krijgt de nieuwe eigenaar volledige toegang tot het beheer van de pod: publiceren van nieuwe versies, toevoegen en verwijderen van andere eigenaren, markeren van de pod als verouderd. Eigenaar kan elke geregistreerde Trunk-gebruiker zijn — voorafgaande registratie is verplicht.
Als een ontwikkelaar het project heeft verlaten of geen toegang meer tot de pod mag hebben:
pod trunk remove-owner MyLibrary developer@email.comEen eigenaar kan alleen worden verwijderd door de huidige eigenaar. De laatste eigenaar van een pod kan niet worden verwijderd — eerst moet een nieuwe worden toegevoegd. Dit voorkomt dat een pod zonder eigenaar komt te zitten.
Als een bibliotheek niet langer wordt ondersteund, kan deze als verouderd (deprecated) worden gemarkeerd. Dit verwijdert de pod niet uit het register, maar voegt een waarschuwing toe voor gebruikers bij installatie:
pod trunk deprecate MyLibraryOptioneel kan een vervangende pod worden opgegeven:
pod trunk deprecate MyLibrary --in-favor-of=NewLibraryBij installatie van een verouderde pod geeft CocoaPods een waarschuwing in de terminal en raadt aan over te stappen op de opgegeven vervanger. Dit is de juiste manier om de ondersteuning van een bibliotheek te beëindigen zonder de builds van bestaande projecten te verstoren.
Informatie over een pod is beschikbaar via het commando pod trunk info:
pod trunk info MyLibraryHet commando toont alle versies van de pod, publicatiedata, lijst van eigenaren en status (actief/verouderd). Voor het bekijken van details van een specifieke versie wordt pod spec cat MyLibrary 0.1.0 gebruikt.
Bij het werken met Trunk komen ontwikkelaars vaak typische fouten tegen. Laten we de meest voorkomende bekijken:
Symptoom: [!] Authentication failed. You need to register a session first.
Oorzaak: Sessietoken ontbreekt of is verlopen. Tokens hebben een beperkte geldigheidsduur (standaard 30 dagen zonder activiteit).
Oplossing: Voer opnieuw pod trunk register your@email.com 'Your Name' uit. Als u CI gebruikt, controleer dan de actualiteit van de variabele COCOAPODS_TRUNK_TOKEN en genereer indien nodig een nieuw token.
Symptoom: [!] You have already pushed version 0.1.0 for MyLibrary.
Oorzaak: Poging tot herpublicatie van een bestaande versie. Trunk staat niet toe dat versies worden overschreven.
Oplossing: Verhoog de versie in podspec volgens semantische versionering. Als u een fout hebt gemaakt in podspec, publiceer dan de volgende versie met de correctie.
Symptoom: [!] The spec did not pass validation. ERROR | [iOS] file patterns: Source files did not match any file.
Oorzaak: Het pad naar bronbestanden in het veld source_files is onjuist opgegeven.
Oplossing: Controleer de paden in podspec, voer pod lib lint lokaal uit tot alle fouten zijn opgelost en herhaal vervolgens de publicatie. Gebruik glob-patronen: Classes/**/*.{h,m}, Sources/MyLibrary/**/*.swift.
Symptoom: [!] Connection to trunk.cocoapods.org failed. Timeout.
Oorzaak: Netwerkproblemen of tijdelijke onbeschikbaarheid van de Trunk-server.
Oplossing: Controleer de beschikbaarheid van de server: curl -I https://trunk.cocoapods.org. Als de server reageert, herhaal het commando dan over enkele minuten. Mogelijk is uw IP geblokkeerd — probeer het via een andere verbinding of via VPN.
Symptoom: [!] You do not have permission to push to MyLibrary.
Oorzaak: U bent niet de eigenaar van de pod. Dit gebeurt als iemand al een pod met deze naam heeft geregistreerd.
Oplossing: Neem contact op met de huidige eigenaar van de pod (te vinden via pod trunk info MyLibrary) en vraag om u toe te voegen via pod trunk add-owner. Als de podnaam bezet is, overweeg dan een alternatieve naam.
Veelgestelde vragen
De oude methode vereiste een handmatige Pull Request in de CocoaPods/Specs-repository. Trunk automatiseert het proces: u voert één commando pod trunk push uit en de server controleert zelf de podspec, voegt deze toe aan het register en werkt de zoekindex bij. Trunk heeft ook toegangsbeheer (meerdere eigenaren), sessietokens en gecentraliseerde opslag van metadata toegevoegd.
Dat is onmogelijk — Trunk verbiedt het verwijderen van gepubliceerde versies om de integriteit van afhankelijkheden te behouden. Als een versie een kritieke fout bevat, publiceer dan een nieuwe versie met de correctie en markeer de problematische versie als verouderd via pod trunk deprecate. Volledige verwijdering is alleen beschikbaar voor CocoaPods-beheerders in uitzonderlijke gevallen.
Nee, het veld s.author moet verplicht een e-mail bevatten. Trunk gebruikt deze om de pod aan het account van de eigenaar te koppelen. Het adres moet overeenkomen met de e-mail die bij registratie via pod trunk register is opgegeven. Als de e-mail in de podspec afwijkt, wordt de publicatie geweigerd.
Gewoonlijk verschijnt de pod binnen 5–15 minuten in de CocoaPods-zoekopdracht. In zeldzame gevallen kan het indexeren tot een uur duren. De pod is direct na een succesvol antwoord van Trunk beschikbaar voor installatie via Podfile — u hoeft alleen de exacte versie of het bereik in Podfile op te geven.
Als u een actieve sessie hebt (token niet verlopen), wijzig dan het e-mailadres via pod trunk register new@email.com — de nieuwe registratie koppelt de pods aan het nieuwe adres. Als de sessie is verlopen, neem dan contact op met CocoaPods-ondersteuning via GitHub Issues. Bewijs van eigendom van de pod kan de mogelijkheid zijn om een commit te maken in de Git-repository van de pod.
Samenvatting
pod trunk register met e-mailbevestiging en automatische opslag van het sessietokenpod trunk push ondergaat validatie op de server; eenmaal gepubliceerde versie kan niet worden verwijderdpod trunk add-owner en pod trunk remove-ownerCOCOAPODS_TRUNK_TOKEN voor automatische publicatie in pipelinesWe ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook