CocoaPods Trunk — un serviciu server al ecosistemului CocoaPods, destinat publicării, găzduirii și gestionării bibliotecilor pod. Trunk a înlocuit mecanismul învechit de publicare prin depozite GitHub și fork-uri, oferind o infrastructură centralizată cu autentificare, gestionare a sesiunilor, versionare și validare înainte de publicare. Dezvoltatorii iOS și macOS folosesc pod trunk push pentru a trimite biblioteci în registrul public.
Principalele aspecte
pod trunk register cu confirmare prin emailpod trunk push trece prin validare, linting și încărcare în registrupod trunk me, pod trunk add-owner, pod trunk deprecate pentru administrarea pod-urilorCocoaPods Trunk — este infrastructura server lansată în 2015 pentru publicarea centralizată a bibliotecilor pod. Înainte de apariția Trunk, fiecare pod era distribuit printr-un depozit Git: dezvoltatorul trebuia să creeze un depozit public, să adauge un fișier podspec și să trimită un Pull Request în depozitul central CocoaPods/Specs. Această abordare necesita moderare manuală și crea întârzieri la publicarea actualizărilor.
Trunk a rezolvat aceste probleme, oferind un API unificat pentru publicarea, actualizarea și ștergerea pod-urilor. Serviciul include patru componente cheie:
Arhitectura Trunk este construită pe stiva Ruby on Rails cu baza de date PostgreSQL. Serviciul utilizează HTTP API cu format JSON pentru toate operațiunile, iar clientul CLI pod trunk face parte din distribuția CocoaPods și se instalează împreună cu gem-ul principal cocoapods.
În prezent, prin Trunk au fost publicate peste 100 000 de pod-uri, iar numărul total de descărcări depășește 50 de miliarde. Zilnic, serviciul procesează mii de cereri de publicare și actualizare a bibliotecilor din partea dezvoltatorilor din întreaga lume.
Înainte de publicarea unui pod, trebuie să vă înregistrați în Trunk. Procesul constă dintr-un singur pas — comanda pod trunk register:
pod trunk register your@email.com 'Your Name' --description='MacBook Pro, dezvoltare iOS'După executarea comenzii, pe adresa de email specificată sosește un e-mail cu un link de confirmare. Accesarea linkului activează contul și creează un token de sesiune, care este salvat în sistemul de chei (Keychain pe macOS, gnome-keyring sau echivalent pe Linux). Tokenul este utilizat automat în toate operațiunile pod trunk ulterioare.
Parametrul --description este opțional, dar recomandat — ajută la identificarea sesiunii la vizualizarea sesiunilor active prin pod trunk me. Dacă lucrați pe mai multe mașini (stație de lucru, server CI), descrierea vă permite să distingeți o sesiune de alta.
Pentru verificarea stării de autentificare se utilizează comanda:
pod trunk meRezultatul afișează emailul, numele, lista pod-urilor dvs. (dacă ați publicat deja) și sesiunile active. Exemplu de rezultat:
- 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, dezvoltare iOSPe serverele CI (GitHub Actions, GitLab CI, Jenkins) autentificarea se realizează printr-un token transmis prin variabila de mediu COCOAPODS_TRUNK_TOKEN. Tokenul poate fi obținut cu comanda:
pod trunk me --token-onlyAcest token este salvat în setările CI ca variabilă secretă, iar la etapa de publicare este utilizat fără o nouă înregistrare. Exemplu pentru GitHub Actions:
env:
COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }}Important: tokenul oferă acces complet la gestionarea pod-urilor asociate contului. Nu îl publicați niciodată în depozite publice și nu îl transmiteți terților. În caz de compromitere, tokenul poate fi revocat prin pod trunk remove-session sau puteți șterge toate sesiunile prin panoul de gestionare de pe site-ul CocoaPods.
Fișierul podspec (.podspec sau .podspec.json) — este manifestul bibliotecii care conține metadate, dependențe, informații despre platforme și codul sursă. Trunk utilizează acest fișier pentru validarea și înregistrarea pod-ului. Un podspec minim pentru publicare arată astfel:
Pod::Spec.new do |s|
s.name = 'MyLibrary'
s.version = '0.1.0'
s.summary = 'Descrierea scurtă a bibliotecii'
s.description = 'Descrierea detaliată cu explicarea capacităților'
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'
endCâmpurile cheie ale podspec:
MAJOR.MINOR.PATCH. Trunk nu acceptă republicarea aceleiași versiuni — trebuie să măriți numărul.MIT, Apache-2.0, BSD sau a altei licențe deschise.Înainte de publicare, podspec trebuie verificat pentru corectitudine cu ajutorul linter-ului:
pod lib lint MyLibrary.podspecLinter-ul verifică sintaxa, existența câmpurilor obligatorii, corectitudinea căilor către fișiere și rezolvabilitatea dependențelor. Dacă în procesul de linting se utilizează surse private (private specs), se adaugă flag-ul --sources. Pentru a omite încărcarea din rețea (doar verificare locală) se utilizează flag-ul --local-only.
Comanda principală pentru publicarea unui pod — pod trunk push. Aceasta transmite fișierul podspec pe serverul Trunk, unde trece printr-o validare completă și este înregistrat în registrul public. Sintaxa:
pod trunk push MyLibrary.podspecFlag-ul --allow-warnings permite publicarea în prezența avertismentelor. În mod implicit, orice avertismente (warnings) blochează publicarea. Dacă biblioteca are avertismente cunoscute care nu afectează funcționalitatea, puteți utiliza acest flag. Important: erorile (errors) blochează întotdeauna publicarea, indiferent de flag-uri.
Flag-ul --synchronous face cererea sincronă — terminalul așteaptă finalizarea validării pe server. În mod implicit, comanda returnează controlul imediat după trimitere, iar serverul procesează publicarea asincron. Modul sincron este util în CI/CD, când următorul pas al pipeline-ului depinde de succesul publicării.
Flag-ul --skip-import-validation omite verificarea importului bibliotecii într-un proiect de test. Aceasta accelerează publicarea, dar nu garantează că biblioteca se compilează efectiv. Utilizați acest flag doar dacă sunteți sigur de corectitudinea build-ului.
Exemplu de publicare cu opțiuni tipice:
pod trunk push MyLibrary.podspec \
--allow-warnings \
--synchronous \
--skip-import-validationDupă o publicare reușită, Trunk returnează un JSON cu detalii:
Congrats
MyLibrary (0.1.0) successfully published
Pod URL: https://cocoapods.org/pods/MyLibraryBiblioteca devine disponibilă pentru instalare prin Podfile al oricărui proiect iOS sau macOS. De obicei, datele din indexul de căutare CocoaPods se actualizează în câteva minute, dar în cazuri rare indexarea poate dura până la o oră.
Restricție importantă: o dată publicată, versiunea unui pod nu poate fi ștearsă. Acest lucru este menit să prevină deteriorarea proiectelor care utilizează deja această versiune. Dacă publicarea a avut loc cu eroare, puteți publica următoarea versiune cu corecția, dar revenirea este imposibilă. Excepție — pod trunk delete, disponibil doar angajaților CocoaPods și aplicat în cazuri extreme (încălcarea licenței, cod malițios).
CocoaPods Trunk oferă mai multe comenzi pentru administrarea pod-urilor publicate:
Pentru a transfera drepturile de publicare a pod-ului unui alt dezvoltator, se utilizează comanda:
pod trunk add-owner MyLibrary developer@email.comDupă executare, noul proprietar primește acces complet la gestionarea pod-ului: publicarea de noi versiuni, adăugarea și eliminarea altor proprietari, marcarea pod-ului ca învechit. Proprietar poate fi orice utilizator înregistrat Trunk — înregistrarea prealabilă este obligatorie.
Dacă un dezvoltator a părăsit proiectul sau nu mai trebuie să aibă acces la pod:
pod trunk remove-owner MyLibrary developer@email.comPoate elimina un proprietar doar proprietarul curent. Nu se poate șterge ultimul proprietar al pod-ului — mai întâi trebuie adăugat unul nou. Acest lucru previne situația în care pod-ul rămâne fără proprietar.
Dacă biblioteca nu mai este suportată, poate fi marcată ca învechită (deprecated). Aceasta nu șterge pod-ul din registru, dar adaugă un avertisment utilizatorilor la instalare:
pod trunk deprecate MyLibraryOpțional, se poate specifica un pod de înlocuire:
pod trunk deprecate MyLibrary --in-favor-of=NewLibraryLa instalarea unui pod învechit, CocoaPods afișează un avertisment în terminal și recomandă trecerea la înlocuitorul specificat. Aceasta este modalitatea corectă de a încheia suportul unei biblioteci fără a afecta build-ul proiectelor existente.
Informațiile despre pod sunt disponibile prin comanda pod trunk info:
pod trunk info MyLibraryComanda afișează toate versiunile pod-ului, datele de publicare, lista proprietarilor și statusul (activ/învechit). Pentru vizualizarea detaliilor unei versiuni specifice se utilizează pod spec cat MyLibrary 0.1.0.
În lucrul cu Trunk, dezvoltatorii întâlnesc adesea erori tipice. Să le analizăm pe cele mai comune:
Simptom: [!] Authentication failed. You need to register a session first.
Cauză: Tokenul de sesiune lipsește sau a expirat. Token-urile au o perioadă limitată de valabilitate (implicit 30 de zile fără activitate).
Soluție: Rulați din nou pod trunk register your@email.com 'Your Name'. Dacă utilizați CI, verificați actualitatea variabilei COCOAPODS_TRUNK_TOKEN și, dacă este necesar, generați un nou token.
Simptom: [!] You have already pushed version 0.1.0 for MyLibrary.
Cauză: Încercarea de a republica o versiune existentă. Trunk nu permite suprascrierea versiunilor.
Soluție: Măriți versiunea în podspec conform versionării semantice. Dacă ați greșit în podspec, publicați următoarea versiune cu corecția.
Simptom: [!] The spec did not pass validation. ERROR | [iOS] file patterns: Source files did not match any file.
Cauză: Calea către fișierele sursă în câmpul source_files este specificată incorect.
Soluție: Verificați căile în podspec, rulați pod lib lint local până la eliminarea tuturor erorilor, apoi repetați publicarea. Utilizați glob-uri: Classes/**/*.{h,m}, Sources/MyLibrary/**/*.swift.
Simptom: [!] Connection to trunk.cocoapods.org failed. Timeout.
Cauză: Probleme de rețea sau indisponibilitatea temporară a serverului Trunk.
Soluție: Verificați accesibilitatea serverului: curl -I https://trunk.cocoapods.org. Dacă serverul răspunde, repetați comanda peste câteva minute. Este posibil ca IP-ul dvs. să fie blocat — încercați de la o altă conexiune sau prin VPN.
Simptom: [!] You do not have permission to push to MyLibrary.
Cauză: Nu sunteți proprietarul pod-ului. Acest lucru se întâmplă dacă cineva a înregistrat deja un pod cu acest nume.
Soluție: Contactați proprietarul actual al pod-ului (poate fi aflat prin pod trunk info MyLibrary) și solicitați să vă adauge prin pod trunk add-owner. Dacă numele pod-ului este ocupat, luați în considerare un nume alternativ.
Întrebări frecvente
Metoda veche necesita un Pull Request manual în depozitul CocoaPods/Specs. Trunk automatizează procesul: executați o singură comandă pod trunk push, iar serverul verifică podspec, îl adaugă în registru și actualizează indexul de căutare. Trunk a adăugat, de asemenea, gestionarea accesului (mai mulți proprietari), token-uri de sesiune și stocarea centralizată a metadatelor.
Acest lucru este imposibil — Trunk interzice ștergerea versiunilor publicate pentru a păstra integritatea dependențelor. Dacă versiunea conține o eroare critică, publicați o nouă versiune cu corecția și marcați versiunea problemă ca învechită prin pod trunk deprecate. Ștergerea completă este disponibilă doar administratorilor CocoaPods în cazuri excepționale.
Nu, câmpul s.author trebuie să conțină obligatoriu emailul. Trunk îl utilizează pentru a lega pod-ul de contul proprietarului. Adresa trebuie să coincidă cu emailul specificat la înregistrarea prin pod trunk register. Dacă emailul din podspec este diferit, publicarea va fi respinsă.
De obicei, pod-ul apare în căutarea CocoaPods în 5–15 minute. În cazuri rare, indexarea poate dura până la o oră. Pod-ul este disponibil pentru instalare prin Podfile imediat după răspunsul reușit de la Trunk — trebuie doar să specificați versiunea exactă sau intervalul în Podfile.
Dacă aveți o sesiune activă (tokenul nu a expirat), schimbați emailul prin pod trunk register new@email.com — noua înregistrare va lega pod-urile de noua adresă. Dacă sesiunea a expirat, contactați suportul CocoaPods prin GitHub Issues. Dovada deținerii pod-ului poate fi posibilitatea de a crea un commit în depozitul Git al pod-ului.
Rezumat
pod trunk register cu confirmare prin email și salvare automată a token-ului de sesiunepod trunk push trece validarea pe server; versiunea publicată nu poate fi ștearsăpod trunk add-owner și pod trunk remove-ownerCOCOAPODS_TRUNK_TOKEN pentru publicare automată în pipeline-uriVom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și