2016-11-21 12 views
7

Tworzę CocoaPod, powiedzmy MyPod, który zależy od innego Cocoapod, powiedzmy RxSwift.Korzystanie z zależności CocoaPod podczas rozwijania CocoaPod

Więc mam to w MyPod.podspec:

s.dependency "RxSwift", "~> 3.0.1" 

Jednak przy opracowywaniu MyPod, w jaki sposób można faktycznie korzysta z uzależnienia?

import RxSwift 
// ^
// No such module 'RxSwift' 

public class MyClass { //... 

Czy jest jakiś krok, którego mi brakuje, czy jakaś wspólna konwencja? Wygląda na to, że niektóre inne projekty, takie jak Moya, używają Carthage do budowania zależności podczas rozwijania. Czy powinienem to robić, a może dodawać Podfile?

Wiem, że nie powinno to stanowić problemu dla przykładowej aplikacji znajdującej się w repozytorium, które ma własną wersję Podfile. Chciałbym jednak, aby testy znajdowały się na najwyższym poziomie, poza aplikacją przykładową, i aby móc faktycznie budować środowisko podczas pracy nad nim, ponownie poza przykładową aplikacją.

Odpowiedz

1

Skończyłem z wykorzystaniem Kartaginy do zbudowania zależności między strukturami. Wyobrażam sobie, że mogłem również użyć CocoaPods. Wymagałoby to jednak rozpoczęcia korzystania z obszaru roboczego i nie chciałem tego robić, aby zmiany były jak najmniejsze.

Również z Kartaginy, nie wymagają, aby dodać nowy Podfile/Podfile.lock, ponieważ Kartagina wykorzysta istniejącą Cartfile/Cartfile.resolved że już tam jest. Dzieje się tak, ponieważ Carthage używa Cartfile.resolved, gdy używa szkieletu w innym projekcie i podczas budowania samej struktury. Natomiast z CocoaPods, *.podspec jest używany podczas korzystania z ram w innym projekcie alePodfile.lock (jeśli dodasz Podfile) jest potrzebny do zainstalowania strąków zależnych w samej ramy.

6

Nie mogę mówić, czy używać CocoaPods, czy Kartaginy. Oba mają swoje mocne strony i słabe punkty. Dodatkowo należy podjąć decyzję, biorąc pod uwagę wiele czynników, z których niektóre mogą nie być w stanie kontrolować (jak klient, który upiera się przy używaniu CocoaPods!) Więc pominę tę część.

Jednak na twoje pytanie, kapsuła, którą rozwijasz, może zależeć od innej kapsuły. Masz już prawidłową linię s.dependency. To konieczne.

Podejrzewam jednak, że powodem, dla którego nie można było powoływać się na zależną kapsułę, mogło być to, że nie posiadałeś Podfile w projekcie "tester/przykład" i/lub nie zrobiłeś pod install po dodaniu zależność w twoim Podspecu.

Powodem tego jest wymaganie Podejrzewam, że ponieważ Podspec w rzeczywistości nie jest w ogóle przetwarzany przez Xcode, w rzeczywistości nie pobiera się (ani nie kompiluje) zależności.

Zamiast tego, kiedy wykonasz instalację pod (oczywiście za pomocą wiersza poleceń), CocoaPods utworzy projekt Pods z twoim modułem rozwojowym, strączkami, od których będziesz zależał (w Podspec), a także innymi podsystemami w twoim Podfile.

Aby przetestować tę teorię, I:

  • Utworzono nową saszetkę (używając własnego CocoaPod za 'lib pod tworzyć' (https://guides.cocoapods.org/making/using-pod-lib-create.html)
  • Otwarty obszar roboczy CocoaPod stworzony dla mnie i redagował Podspec do. dodać zależność s.dependency 'RxSwift', '~> 3.0.1'.
  • dodaje inny pod moim Podfile przykład aplikacji (aby wykazać różnicę między zależnościami Podfile i zależności Podspec.)
  • Wykonywane pod install w FOLDE przykładzie aplikacji r.
  • Zmieniono klasę mojego Poda, by zrobić coś pożytecznego i dodać linię import RxSwift.
  • Dodano etykietę do mojej przykładowej aplikacji (oczywiście "Hello World").
  • Używane PureLayout zrobić wszystkie ograniczenia układu auto na etykiecie (i wykazać w jaki sposób projekt Przykład ma dostęp do obu strąków -. Strąka rozwoju, jak również odwołanie strąka PureLayout)

Można sprawdzić z demo utworzonego w moim publicznym GitHub: https://github.com/ericwastaken/CocoaPod-Dependency-Demo

szczerze, stworzyliśmy kilka strąków pomocą pod lib create i rzeczywiście ma stworzyć miłą strukturę, która zawsze pracował dla mnie. Z tego powodu, polecam zawsze używać go do tworzenia szkieletu twojego strąka.

Xcode 8 komentarz: pod lib create nadal wydaje się tworzyć projekt Swift 1.x. Tak więc, zaraz po skorzystaniu z tego narzędzia, po otwarciu Xcode pojawi się propozycja "konwersji" na nowszą wersję Swift. Pozwoliłbym, aby konwersja następowała wtedy i tam (po raz pierwszy), abyś mógł być w składni Swift 2.x lub 3.x (wybierzesz).

+0

Dzięki za dokładną odpowiedź. Jednak myślę, że przegapiłeś ostatnią część mojego pytania, gdzie mówię, że nie chcę się rozwijać poprzez ExampleApp (lub nawet mieć go w ogóle) i chcę mieć moje testy na najwyższym poziomie w ramach samo. Chcę, aby mój ExampleApp (jeśli nawet mam) był tam po prostu, aby pokazać, w jaki sposób można wykorzystać framework. Nie powinien zawierać niczego istotnego, jak testy. Powinien być w stanie usunąć bez obaw. – solidcell

+0

Zachęcam do sklonowania repo, które stworzyłem. Zauważysz, że przykładowa aplikacja nie jest potrzebna do czegokolwiek i naprawdę może zostać usunięta. Robisz wszystko w "kapsułach rozwoju", tak jak ty. Ponadto możesz rzeczywiście pisać testy jednostkowe przeciwko strąkowi. Docelowy cel jednostki może po prostu mieć podległość jako zależność i możesz użyć TESTOWEGO, aby wystawić prywatne metody na testy. Możesz je sklonować i eksperymentować z usunięciem przykładu. Zauważ, że nadal potrzebujesz Podfile, ale to może być samo w sobie. – ericWasTaken

+0

Tak, tak na koniec, głównym wyborem jest to, że nadal potrzebujesz dodatkowego "Podfile", aby framework mógł się sam zbudować. Co do repo, próbowałem go zbudować, ale dostaję z tym mnóstwo problemów Xcode. Pliki nie znaleziono (czerwony), a następnie dodaje folder kompilacji na '../ build' podczas próby zbudowania. Jeśli zamknę i ponownie go otworzę, utworzy on skopiowany schemat dla każdego schematu: "___ 2" dla każdego. W porządku, ponieważ już znalazłem to samo rozwiązanie, co Ty ("Podfile"), pomijając różnice w ustawieniach projektu. – solidcell

Powiązane problemy