Czym jest Carthage i jak może zoptymalizować tworzenie aplikacji?

Carthage to menedżer zależności dla projektów na iOS i macOS, który pozwala deweloperom w prosty i wydajny sposób integrować biblioteki zewnętrzne z aplikacjami. W przeciwieństwie do innych narzędzi, takich jak CocoaPods, Carthage stawia na minimalizm i nieinwazyjność, co oznacza, że nie zmienia struktury projektu i wymaga jedynie prostego pliku tekstowego, Cartfile, z listą zależności. Dzięki temu stał się popularnym wyborem wśród deweloperów, którzy chcą zachować kontrolę nad konfiguracją projektu, a jednocześnie korzystać z bibliotek i frameworków zewnętrznych.

Carthage działa, budując binarne frameworki, które można następnie zintegrować bezpośrednio z projektami Xcode. Takie podejście oznacza, że deweloperzy mogą korzystać z krótszych czasów budowania i bardziej usprawnionego procesu tworzenia. Dzięki Carthage zależności można łatwo dodawać, aktualizować i nimi zarządzać bez złożonych plików konfiguracyjnych i niechcianych zmian w projekcie. W zamian zbudowane frameworki dodaje się do Xcode ręcznie. Czyni to Carthage dobrym narzędziem dla osób, które chcą prostego, ale potężnego rozwiązania do zarządzania zależnościami w projektach na iOS i macOS.

Carthage to zdecentralizowany menedżer zależności dla projektów na iOS i macOS. Pobiera i buduje biblioteki zewnętrzne jako frameworki, które deweloper następnie sam dodaje do projektu Xcode, bez automatycznej zmiany pliku projektu. Daje to pełną kontrolę nad strukturą projektu i może zapewnić krótsze czasy budowania, ponieważ zależności są budowane tylko wtedy, gdy są aktualizowane. Carthage jest używany głównie jako prostsza alternatywa dla CocoaPods, natomiast Swift Package Manager to wbudowane rozwiązanie Apple do zarządzania pakietami.

More about Carthage

Carthage to menedżer zależności dla iOS i macOS, który oferuje prosty i elastyczny sposób integrowania bibliotek zewnętrznych z projektami. W przeciwieństwie do innych narzędzi, które automatycznie zmieniają konfigurację projektu, Carthage stawia na minimalną konfigurację i daje deweloperom swobodę zarządzania projektami bez zbędnych ograniczeń.

Od strony technicznej Carthage działa, budując binarne frameworki z kodu źródłowego lub pobierając gotowe, co pozwala deweloperom dołączać te frameworki bezpośrednio do projektów Xcode. Oznacza to, że Carthage nie zmienia plików projektu, lecz generuje folder „Carthage/Build”, w którym przechowywane są skompilowane frameworki. Takie podejście daje deweloperom pełną kontrolę nad strukturą projektu i zależnościami.

Carthage obsługuje trzy podstawowe funkcje, z których każda oferuje inny sposób obsługi zależności:

  1. Budowanie zależności: Carthage może automatycznie zbudować wszystkie zależności określone w pliku „Cartfile”. Pozwala to deweloperom skupić się na własnym kodzie, podczas gdy Carthage zajmuje się kompilacją zewnętrznych bibliotek. Ta funkcja jest idealna dla projektów, które wymagają wielu bibliotek zewnętrznych.

  2. Aktualizowanie zależności: Jednym poleceniem Carthage może zaktualizować wszystkie zależności do najnowszych wersji, które spełniają wymagania dotyczące wersji w pliku Cartfile. Ułatwia to utrzymywanie bibliotek w aktualnym stanie, łącznie z poprawkami bezpieczeństwa, co jest ważne dla zachowania kompatybilności i bezpieczeństwa.

  3. Integrowanie frameworków: Carthage generuje frameworki, które deweloper sam dodaje do projektu Xcode, zwykle w sekcji „Frameworks, Libraries, and Embedded Content”. Wymaga to ręcznego kroku, ale daje pełny wgląd w to, które dokładnie biblioteki są częścią projektu, i ułatwia korzystanie z nowych funkcji i ulepszeń w bibliotekach zewnętrznych.

Jedną z największych zalet Carthage jest prostota i elastyczność. Unikając automatycznych zmian w projekcie, Carthage pozwala deweloperom zachować kontrolę nad projektami. Zmniejsza to ryzyko konfliktów w pliku projektu i ułatwia integrowanie nowych zależności bez zakłócania istniejących struktur projektu.

Podejście Carthage do zarządzania zależnościami oszczędza też czas w codziennej pracy. Budując zależności tylko wtedy, gdy są dodawane lub aktualizowane, i unikając zbędnych zmian w projekcie, Carthage minimalizuje czas i zasoby potrzebne do utrzymania projektu. Czyni go to dobrym narzędziem dla deweloperów, którzy chcą zoptymalizować swoje przepływy pracy i skupić się na dostarczaniu oprogramowania wysokiej jakości.

W praktyce Carthage miał znaczący wpływ na to, jak deweloperzy zarządzają zależnościami w projektach na iOS i macOS. Był używany zarówno przez małe, jak i duże zespoły deweloperskie do utrzymywania projektów w aktualnym, bezpiecznym i łatwym w utrzymaniu stanie. Dziś jednak rozwój Carthage znacznie zwolnił, a większość bibliotek jest obecnie kierowana przede wszystkim do Swift Package Manager.

Podsumowując, Carthage to narzędzie, które łączy prostotę, elastyczność i wydajność w rozwiązaniu sprawiającym, że zarządzanie zależnościami jest bardziej przejrzyste zarówno dla pojedynczych deweloperów, jak i dużych zespołów. Prosta konfiguracja i minimalna ingerencja w strukturę projektu uczyniły go przydatnym narzędziem w tworzeniu aplikacji, w którym szybkie i bezpieczne integracje są konieczne.

Frequently asked questions about Carthage

Czym jest Carthage i jak działa w praktyce?

Carthage to zdecentralizowany menedżer zależności dla projektów na iOS, macOS, tvOS i watchOS napisanych w Swift i Objective-C. Nie ma centralnego rejestru pakietów. Zamiast tego każda zależność wskazuje bezpośrednio na repozytorium Git, zwykle na GitHubie.

Zależności określa się w pliku tekstowym o nazwie Cartfile w folderze głównym projektu. Po uruchomieniu polecenia carthage update Carthage znajduje odpowiednie wersje, pobiera kod źródłowy do folderu Carthage/Checkouts i buduje każdą bibliotekę za pomocą narzędzi do budowania Xcode. Gotowe frameworki są umieszczane w Carthage/Build.

Carthage nie zmienia pliku projektu Xcode. Deweloper dodaje zbudowane frameworki w sekcji Frameworks, Libraries, and Embedded Content w odpowiednim targecie. Daje to pełną kontrolę nad konfiguracją projektu, ale wymaga nieco więcej ręcznej pracy niż narzędzia, które integrują automatycznie.

Jak zainstalować Carthage i jak dodać bibliotekę?

Carthage najczęściej instaluje się za pomocą Homebrew poleceniem brew install carthage. Alternatywnie można pobrać pakiet instalacyjny z wydań projektu na GitHubie.

Bibliotekę dodaje się zwykle w czterech krokach:

  • W folderze głównym projektu tworzy się plik Cartfile z wierszem takim jak github "Alamofire/Alamofire" ~> 5.0.
  • Polecenie carthage update --use-xcframeworks --platform iOS pobiera i buduje bibliotekę.
  • Gotowy .xcframework z Carthage/Build przeciąga się do sekcji Frameworks, Libraries, and Embedded Content w targecie aplikacji.
  • W przypadku frameworków dynamicznych wybiera się Embed & Sign.

Operator ~> oznacza, że nowsze wersje są akceptowane, dopóki wersja główna pozostaje taka sama. Bibliotekę można następnie używać w kodzie za pomocą import Alamofire.

Jaka jest różnica między plikami Cartfile i Cartfile.resolved?

Cartfile opisuje, jakich zależności potrzebuje projekt i jakie wymagania dotyczące wersji muszą one spełniać, np. ~> 5.0, >= 2.1 lub konkretną gałąź. Plik jest edytowany ręcznie i wyraża zamiar.

Cartfile.resolved jest generowany automatycznie i zawiera dokładne wersje lub commity, które faktycznie zostały wybrane, także dla zależności samych zależności. Plik działa jak blokada, dzięki czemu wszyscy w zespole i każdy serwer buildów otrzymują dokładnie ten sam kod.

Różnica widoczna jest w poleceniach:

  • carthage update znajduje najnowsze wersje pasujące do Cartfile i zapisuje wynik w Cartfile.resolved.
  • carthage bootstrap pobiera i buduje dokładnie te wersje, które są wymienione w Cartfile.resolved.

Oba pliki należy więc przechowywać w systemie kontroli wersji. Zależności używane tylko podczas tworzenia, takie jak biblioteki testowe, można umieścić w Cartfile.private.

Jak Carthage buduje XCFrameworki i dlaczego ma to znaczenie?

Wcześniej Carthage budował tzw. fat frameworki, w których kod dla fizycznych urządzeń i symulatora był łączony w jeden plik za pomocą narzędzia lipo. Przestało to działać w Xcode 12, ponieważ zarówno urządzenia, jak i symulatory na Apple Silicon używają architektury arm64, a ta sama architektura nie może wystąpić dwukrotnie w jednym fat frameworku.

Rozwiązaniem są XCFrameworki, które Apple wprowadziło w Xcode 11. XCFramework to pakiet z osobnym plikiem binarnym dla każdej platformy i wariantu, takich jak urządzenie iOS i symulator iOS. Od Carthage 0.37 XCFrameworki buduje się z flagą --use-xcframeworks, np. carthage bootstrap --use-xcframeworks.

Wynik jest umieszczany jako foldery .xcframework w Carthage/Build. Dodaje się je bezpośrednio do targetu aplikacji, a dawna faza budowania z carthage copy-frameworks nie jest już potrzebna.

Jaka jest różnica między Carthage, CocoaPods i Swift Package Manager?

Te trzy narzędzia rozwiązują to samo zadanie, ale na różne sposoby:

  • Carthage jest zdecentralizowany i pobiera zależności bezpośrednio z repozytoriów Git określonych w pliku Cartfile. Biblioteki są budowane jako binarne frameworki, a projekt Xcode nie jest zmieniany. Integracja odbywa się ręcznie.
  • CocoaPods używa centralnego rejestru bibliotek i pliku Podfile. Polecenie pod install tworzy workspace i zmienia konfigurację projektu, więc integracja odbywa się automatycznie, ale jest mniej przejrzysta. CocoaPods jest obecnie w trybie utrzymania.
  • Swift Package Manager (SPM) to własne narzędzie Apple wbudowane w Xcode. Pakiety dodaje się bezpośrednio w Xcode lub opisuje w pliku Package.swift, a dodatkowa instalacja nie jest wymagana.

Carthage przydaje się, gdy potrzebna jest pełna kontrola nad plikiem projektu i krótsze czasy budowania, ponieważ zależności są budowane tylko przy aktualizacji. W nowych projektach SPM jest obecnie najczęściej wybieranym rozwiązaniem, ponieważ obsługuje go większość bibliotek.

Jak ograniczyć czasy budowania z Carthage?

Ponieważ Carthage domyślnie buduje zależności z kodu źródłowego, pierwszy build może trwać długo. Kilka opcji pozwala skrócić ten czas:

  • --platform iOS ogranicza budowanie do platform, których projekt faktycznie używa.
  • --cache-builds pomija zależności, które zostały już zbudowane w tej samej wersji, więc ponownie budowane są tylko zmienione biblioteki.
  • Poszczególne zależności można aktualizować osobno, np. poleceniem carthage update Alamofire, zamiast aktualizować wszystkie.
  • Wiele bibliotek udostępnia gotowe frameworki w swoich wydaniach na GitHubie, które Carthage pobiera automatycznie. SDK o zamkniętym kodzie źródłowym można określić za pomocą binary i adresu URL do specyfikacji JSON.

Na serwerach buildów folder Carthage/Build można też przechowywać w cache między uruchomieniami. Wiele zespołów trzyma ten folder poza Gitem za pomocą .gitignore i odtwarza go poleceniem carthage bootstrap.

Carthage for dummies

Carthage to narzędzie, które pomaga porządkować i zarządzać małymi elementami składowymi, z których zbudowane są aplikacje, nazywanymi „zależnościami”. Wyobraźmy sobie budowanie aplikacji, która potrzebuje gotowych części stworzonych już przez innych, aby działała lepiej. Carthage pomaga pobierać te części i śledzić je, więc nie trzeba ich tworzyć od zera. Działa to trochę jak bibliotekarz, który pilnuje wszystkich książek potrzebnych do projektu, aby pisarz mógł skupić się na własnej historii. Ułatwia to i przyspiesza tworzenie aplikacji, ponieważ można ponownie wykorzystywać pracę innych, mając pewność, że wszystko do siebie pasuje.

Dodaj komentarz