Myślę, że istnieją trzy kluczowe elementy, które należy zrozumieć w zakresie struktury projektu: Cele , projekty i obszary robocze . Cele określają szczegółowo, w jaki sposób budowany jest produkt / plik binarny (tj. Aplikacja lub biblioteka). Obejmują ustawienia kompilacji, takie jak flagi kompilatora i konsolidatora, i określają, które pliki (kod źródłowy i zasoby) faktycznie należą do produktu. Podczas budowania / uruchamiania zawsze wybierasz jeden konkretny cel.
Prawdopodobnie masz kilka celów, które współużytkują kod i zasoby. Te różne cele mogą być nieco różnymi wersjami aplikacji (iPad / iPhone, różne marki,…) lub testami, które naturalnie potrzebują dostępu do tych samych plików źródłowych co aplikacja. Wszystkie te powiązane cele można zgrupować w projekcie . Chociaż projekt zawiera pliki ze wszystkich swoich celów, każdy cel wybiera własny podzbiór odpowiednich plików. To samo dotyczy ustawień kompilacji: w projekcie możesz zdefiniować domyślne ustawienia dla całego projektu, ale jeśli jeden z celów wymaga innych ustawień, zawsze możesz je tam zastąpić:
Wspólne ustawienia projektu, które dziedziczą wszystkie cele, chyba że je zastąpią
Ustawienia docelowe betonowe: PSE iPhone przesłania projektu Base SDK
ustawienie
W Xcode zawsze otwierasz projekty (lub obszary robocze, ale nie cele), a wszystkie zawarte w nim cele można budować / uruchamiać, ale nie ma możliwości / definicji budowy projektu, więc każdy projekt potrzebuje co najmniej jednego celu, aby być czymś więcej niż zbiorem plików i ustawień.
Wybierz jeden z celów projektu do uruchomienia
W wielu przypadkach potrzebujesz projektów. Jeśli masz zależność zbudowaną ze źródła, możesz osadzić ją jako podprojekt . Podprojekty można otwierać osobno lub w ramach ich super projektu.
demoLib jest podprojektem
Jeśli dodasz jeden z celów podprojektu do zależności super projektu, podprojekt zostanie automatycznie zbudowany, chyba że pozostanie niezmieniony. Zaletą jest to, że możesz edytować pliki z projektu i zależności w tym samym oknie Xcode, a podczas kompilacji / uruchamiania możesz wybierać spośród celów projektu i jego podprojektów:
Jeśli jednak twoja biblioteka (podprojekt) jest wykorzystywana przez wiele innych projektów (a dokładniej ich cele), sensowne jest umieszczenie jej na tym samym poziomie hierarchii - do tego właśnie służą obszary robocze . Obszary robocze zawierają projekty i zarządzają nimi, a wszystkie projekty, które zawiera bezpośrednio (tj. Nie ich podprojekty) są na tym samym poziomie, a ich cele mogą być od siebie zależne (cele projektów mogą zależeć od celów podprojektów, ale nie odwrotnie).
Struktura obszaru roboczego
W tym przykładzie, obie aplikacje ( AnotherApplication / ProjectStructureExample ) mogą odwoływać się demoLib cele projektu. Byłoby to również możliwe poprzez włączenie projektu demoLib w obu innych projektach jako podprojektu (który jest jedynie referencją, więc nie jest konieczne powielanie), ale jeśli masz wiele zależności krzyżowych, obszary robocze mają większy sens. Jeśli otworzysz obszar roboczy, możesz wybierać spośród wszystkich celów projektu podczas budowania / uruchamiania.
Nadal możesz otwierać pliki projektu osobno, ale jest prawdopodobne, że ich cele nie zostaną zbudowane, ponieważ Xcode nie rozwiąże zależności, chyba że otworzysz plik obszaru roboczego. Obszary robocze dają tę samą korzyść, co podprojekty: po zmianie zależności Xcode przebuduje ją, aby upewnić się, że jest aktualna (chociaż miałem z tym pewne problemy, wydaje się, że nie działa niezawodnie).
Wasze pytania w skrócie :
1) Projekty zawierają pliki (kod / zasoby), ustawienia i cele, które tworzą produkty na podstawie tych plików i ustawień. Obszary robocze zawierają projekty, które mogą się nawzajem odnosić.
2) Oba są odpowiedzialne za uporządkowanie całego projektu, ale na różnych poziomach.
3) Myślę, że projekty są w większości przypadków wystarczające. Nie używaj obszarów roboczych, chyba że istnieje konkretny powód. Ponadto zawsze możesz później osadzić swój projekt w obszarze roboczym.
4) Myślę, że do tego właśnie służy powyższy tekst…
Jedna uwaga dotyczy 3): CocoaPods , która automatycznie obsługuje biblioteki innych firm, używa obszarów roboczych. Dlatego też musisz ich używać, kiedy używasz CocoaPods
(co robi wiele osób).