Mam problem z ciekawostkami.
Mam projekt, nad którym pracowałem i zawsze budowałem w środowisku XCode IDE i działał dobrze. Teraz konfiguruję Bamboo, aby zbudował projekt i jako taki buduję go z wiersza poleceń.
Problem polega na tym, że jeśli sprawdzę swój kod z GIT, a następnie użyję xcodebuild, aby go zbudować, mówi, że schematu nie można znaleźć, ale jeśli otworzę projekt, kompiluje się i jeśli spróbuję zbudować go ponownie z wiersza poleceń z tym samym poleceniem działa.
Jaką magię robi XCode, gdy otwieram projekt lub robię coś głupiego, może wykluczając plik w moim .gitignore, którego nie powinienem?
xcode
xcodebuild
bamboo
Zac Tolley
źródło
źródło
Odpowiedzi:
Jesteś na dobrej drodze, jeśli chodzi o plik .xcscheme - miałem ten problem podczas tworzenia własnych projektów!
Dla potomnych, a przynajmniej dla każdego, kto trafił tutaj z poszukiwań, mamy dwie wersje rzeczy - „Jestem zajęty, więc proszę o fakty” oraz bardziej zaangażowaną dyskusję i uzasadnienie. Obie te wersje zakładają, że próbujesz budować z pliku Workspace; jeśli nie, to przepraszam, ponieważ dotyczy to głównie projektów opartych na przestrzeni roboczej.
Wersja skrócona „Napraw to”
Główną przyczyną jest to, że domyślne zachowanie schematów polega na utrzymywaniu schematów jako „prywatnych”, dopóki nie zostaną wyraźnie oznaczone jako udostępnione. W przypadku kompilacji inicjowanej z wiersza polecenia interfejs użytkownika Xcode nigdy nie działa, a narzędzie xcoderun nie ma własnej pamięci podręcznej schematów do pracy. Celem jest wygenerowanie, udostępnienie i zatwierdzenie schematu, który ma działać Bamboo:
Głębsza dyskusja i uzasadnienie
Xcode 4 wprowadził Obszary robocze i schematy, aby pomóc w próbie okiełznania chaosu nieodłącznie związanego z mechaniką okablowania projektów Xcode, budowania celów i wspólnego budowania konfiguracji. Sam obszar roboczy ma swój własny zestaw danych konfiguracyjnych, który opisuje każde z mniejszych „pudełek” danych, które zawiera, i działa jako szkielet do dołączania plików .xcodeproj oraz zestawu współużytkowanych danych konfiguracyjnych, które są dublowane na każdej maszynie deweloperskiej lub systemie CI . To jest zarówno moc, jak i pułapka obszarów roboczych - istnieje 1) wiele sposobów, na które można uzyskać konfigurację w 100% poprawnie, ale umieścić ją w niewłaściwym pojemniku lub 2) umieścić we właściwym kontenerze, ale nieprawidłowo skonfigurowanym, renderując dane niedostępne dla innych części systemu!
Domyślnym zachowaniem schematów Xcode 4 jest automatyczne generowanie nowych schematów w miarę dodawania projektów do pliku Workspace. Ci z was, którzy dodali kilka plików .xcodeproj, mogli zauważyć, że lista schematów szybko staje się niesforna, zwłaszcza gdy pliki projektów są dodawane, a następnie usuwane, a następnie ponownie wczytywane do tego samego obszaru roboczego. Wszystkie schematy, generowane automatycznie lub tworzone ręcznie, domyślnie są schematami „prywatnymi” i są widoczne tylko dla bieżącego użytkownika, nawet jeśli pliki .xcuserdata są zatwierdzone z danymi projektu i konfiguracją. Jest to główna przyczyna tego tajemniczego błędu kompilacji Raporty Bamboo z xcodebuild - ponieważ Bamboo obsługuje kompilację za pomocą wiersza poleceń, a nie interfejsu użytkownika Xcode, nie ma możliwości automatycznego generowania schematów i opiera się tylko na tych, które są zdefiniowane w samym obszarze roboczym.
xcodebuild szuka pliku <'scheme' Parameter Value> .xcscheme istniejącego w <'workspace' Parameter Value> / xcshareddata / xcschemes.
Oczywiście istnieje wiele sposobów, w jakie można skonfigurować zarówno Bamboo, jak i obszar roboczy, więc pamiętaj, że Twoja unikalna konfiguracja może nie odpowiadać w 100% temu, co jest tutaj przedstawione. Kluczowe wnioski:
Pole „Udostępnione” jest już zaznaczone ... co teraz?
Napotkałem ten sam problem na mojej własnej instancji Bamboo; okazało się, że schemat, który został zatwierdzony w moim repozytorium, był przestarzały, a najnowsza wersja narzędzi wiersza poleceń nie radziła sobie z nim prawidłowo. Ponieważ istniało to wcześniej, przejrzałem ustawienia, aby upewnić się, że w schemacie nie ma nic rażąco niestandardowego, usunąłem i odtworzyłem schemat, upewniając się, że oznaczyłem go jako `` Współdzielony '' i ponownie wprowadzając nowy plik .xcscheme do magazyn.
Jeśli wszystko wygląda dobrze, a odbudowanie go nie rozwiązuje problemu, sprawdź dokładnie to ustawienie kontenera - naprawdę łatwo jest podłączyć ten schemat do niewłaściwego kontenera w hierarchii!
źródło
Debuguj problem w następujący sposób:
lub jeśli korzystasz z obszaru roboczego (np. z podami)
Jeśli Twojego schematu nie ma na liście, napraw w ten sposób:
źródło
xcodebuild -list
... dzięki!Większość odpowiedzi sugeruje udostępnienie schematu za pomocą Xcode, a następnie zatwierdzenie zmian w repozytorium. To oczywiście działa, ale tylko wtedy, gdy masz dostęp do kodu źródłowego i masz prawa do wprowadzania zmian oraz kilka innych założeń.
Ale jest kilka „a co, jeśli ” do rozważenia
W rzeczywistości zdarza się to dość często. Jeśli korzystasz z platformy do automatyzacji testów, takiej jak Calabash, zwykle zduplikujesz istniejący cel, który automatycznie powiela również schemat, a nowy schemat nie jest udostępniany, nawet jeśli pierwotny schemat był.
Klejnot Ruby i xcodeproj
Polecam użycie xcodeproj Ruby gem. To naprawdę fajne narzędzie typu open source, które może pomóc zautomatyzować mnóstwo zadań związanych z Xcode.
Przy okazji, jest to klejnot używany przez CocoaPods do bałaganu z projektami Xcode i obszarami roboczymi.
Więc zainstaluj to
Następnie napisać prosty skrypt Ruby do ponownego udziału wszystkich schematów, gem ma recreate_user_schemes metody do tego celu
Nie tylko kopiuje pliki schematów z folderu użytkownika do xcshareddata / xcschemes , ale także tworzy te pliki najpierw, analizując plik pbxproj .
źródło
recreate_user_schemes
nie obsługuje on poprawnie celów testowych. Mam złożył raport o błędzie o nim .xcodebuild -project Finance.xcodeproj -scheme "Finance" -configuration Release clean archive CODE_SIGN_IDENTITY="My Identity"
, otrzymałem polecenie „Scheme <IDEScheme: 0x7fc9ea5e5fd0: 'Finance'> o zbudowanie i zarchiwizowanie, ale miejsce docelowe uruchomienia <IDERunDestination: 0x7fc9eb47c6c0: 'iPad 2'> nie jest platformą wdrożeniową i ta akcja nie powinna była było dozwolone ”. Ale kiedy otwieram XCode, wszystko działa dobrzearchive
działanie zawsze obejmuje podpisywanie, a miejsce docelowe musi być ustawione na prawdziwe urządzenie. W twoim przypadku miejscem docelowym jestiPad 2
, jak sądzę, symulator, więc archiwizacja nie jest możliwa. Brakuje jednej ważnej opcji w twoim poleceniu,-sdk iphoneos
najpierw wypróbuj ją i zobacz, jak to działa. Kiedy uruchamiasz go z Xcode IDE, prawdopodobnie masz ustawione miejsce doceloweiOS Device
lub może masz podłączone prawdziwe urządzenie, więc jest ustawione jako miejsce docelowe. Dlatego archiwizacja działa w IDE. Linia poleceń jest bardziej „głupia” i czasami może używać „złych” opcji domyślnie, więc musisz być bardziej szczegółowy.Ok, wiem, że to 2 minuty później, ale znalazłem inne przepełnienie stosu, które mówi, że schemat musi być ustawiony na udostępniony ... Gdzie Xcode 4 przechowuje dane schematu?
źródło
Jedną z częstych przyczyn braku schematu jest zapominanie o przesunięciu zatwierdzeń do źródła. Jeśli otrzymasz komunikat o braku schematu, najpierw sprawdź, czy schemat jest udostępniony, a następnie sprawdź, czy zatwierdziłeś zmiany ORAZ wysłałeś je do serwera pochodzenia.
źródło
Miałem ten błąd podczas implementacji CI.Pytanie powyżej jest identyczne z moimi problemami, z wyjątkiem tego, że używam własnego narzędzia CI Gitlab.Możesz sprawdzić, czy taki plik jest w Bamboo.
Rozwiązałem to, wprowadzając pewne zmiany w
gitlab-ci.yml
pliku.Po tym, jak skorzystałeś
scheme
z udostępniania. W Xcode Idź doProducts>Scheme>Manage Scheme
i zaznacz udostępnij, aby udostępnić.Zmiany
źródło
Mam ten sam problem, ale podczas kompilowania z xcode jako podprojektem głównego. Zbudowano podprojekt w samodzielnym xcode - po tym błąd zniknął.
źródło
Zmierzyłem się z tym problemem i nawet jeśli niektóre odpowiedzi tutaj faktycznie dostarczają rozwiązania, nie było to zbyt jasne. Więc dodam jeszcze jeden. Krótko mówiąc, jak udostępnić schemat z excode.
Przejdź do
Product
>Scheme
>Manage Schemes
Zostanie wyświetlona lista schematów, z których każdy będzie oznaczony jako udostępniany lub nie. Po prostu zaznacz te, które chcesz udostępnić (mogą to być różne dla wersji deweloperskiej i produkcyjnej)
Obrazy zaczerpnięte z tego artykułu https://developer.nevercode.io/docs/sharing-ios-project-schemes
źródło
Chcę dodać rozwiązanie dla mojej sprawy związanej z tym wątkiem. Ten jest dla Ciebie, który klonuje istniejący projekt, a wszystkie potrzebne schematy są już udostępniane:
, z
fastlane lanes
poprawnym wyświetlaniem wszystkich twoich pasów, w tym wszystkich twoich schematów:, ale
fastlane gym
pokazuj tylko główne schematy (nie schematy tworzenia i testowania):Rozwiązaniem jest odznaczenie opcji wspólnej dla schematów, których nie ma na liście,
fastlane gym
a następnie ponowne zaznaczenie . Wygeneruje .xcscheme dla schematów:Teraz, jeśli sprawdzisz
fastlane gym
, wszystkie schematy zostaną wyświetlone:Następnie powinieneś zatwierdzić ten plik .xcshemes do repozytorium, aby inny programista, który sklonował projekt, otrzymał pliki.
źródło
Dla każdego, kto ma Xcode 11.4 i próbuje znaleźć przycisk „Współdzielony” w schemacie, jest teraz przeniesiony do schematu indywidualnego.
źródło