xcodebuild mówi, że nie zawiera schematu


125

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?


Właśnie zauważyłem, że kiedy otwieram projekt w xcode jest tworzony plik .xcscheme, ale w folderze xcuserdata / username.xcuserdatad ... ale nie rozumiem, dlaczego schemat jest `` generowany '' pod folderem użytkowników ... i jak się mam zamierzam sobie z tym poradzić w bambusie
Zac Tolley,

Odpowiedzi:


187

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:

  1. Na czystej kopii roboczej kodu otwórz obszar roboczy projektu.
  2. Wybierz Schemat> Zarządzaj schematami ... z menu produktów.
  3. Pojawi się lista schematów zdefiniowanych dla projektu.
  4. Zlokalizuj schemat, który Bamboo próbuje uruchomić
  5. Upewnij się, że pole „Udostępnione” jest zaznaczone dla tego schematu i że ustawienie „Kontener” jest ustawione na obszar roboczy, a nie sam plik projektu.
  6. Kliknij „OK”, aby zamknąć arkusz Zarządzaj schematami.
  7. Nowy plik .xcscheme został utworzony w Twoim projekcie w WorkspaceName.xcworkspace / xcshareddata / xcschemes.
  8. Zatwierdź ten plik w swoim repozytorium i uruchom kompilację 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 -workspace MyWorkspace.xcworkspace -scheme MyApplication -configuration Debug

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:

  1. Niektóre zautomatyzowane zadania, którymi w magiczny sposób zajmuje się interfejs użytkownika Xcode, nie są dostępne przez interfejs CLI Xcodebuild.
  2. Możesz dołączyć schemat i tworzyć dane konfiguracyjne w wielu miejscach w `` hierarchii kontenerów '' - upewnij się, że dane trafiają do właściwego kontenera (obszar roboczy, projekt i / lub cel kompilacji)
  3. Zastanów się, gdzie w hierarchii kontenerów narzędzie xcodebuild może szukać danych konfiguracyjnych; świetnym wskaźnikiem tego, gdzie zacznie szukać, jest użycie argumentów „-workspace” lub „-project”.

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!


Naprawiło to losowy błąd xcodebuild, który zwracał ŻADNE błędy, ale kod zakończenia 65. Okazuje się, że kontener był ustawiony na projekt, a nie na sam obszar roboczy, zmienił go i voila, problem rozwiązany. Dzięki.
Simon Lee,

Dzięki! To jest dokładnie ta poprawka, której szukałem.
raidfive

MY Test i opcja archiwizacji są wyłączone z tego powodu. Sprawdziłem, czy mój schemat jest udostępniany. nadal nie mogę zbudować przez bota, mogę budować lokalnie, ale jak wspomniałem, nie mogę go zarchiwizować. Czy myślisz, że ma to związek z tym problemem
Alix

Dzięki! Ustawienie kontenera schematu na mój obszar roboczy rozwiązało problemy, które miałem z moimi kompilacjami TeamCity.
Formularz

jak znaleźć schemat z tej wiadomości. Otrzymuję dokładnie ten komunikat. [Xcodebuild: błąd: Obszar roboczy o nazwie „jamesAppV2” nie zawiera schematu o nazwie „”. Opcji „-list” można użyć do znalezienia nazw schematów w obszarze roboczym.]
Qadir Hussain

52

Debuguj problem w następujący sposób:

xcodebuild -list

lub jeśli korzystasz z obszaru roboczego (np. z podami)

xcodebuild -workspace MyProject.xcworkspace -list

Jeśli Twojego schematu nie ma na liście, napraw w ten sposób:

wprowadź opis obrazu tutaj


Dzięki udostępnieniu schematów mogą pojawić się w xcodebuild -list... dzięki!
Dan Rosenstark

35

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

  • A co, jeśli z jakiegoś powodu nie możesz zmodyfikować projektu Xcode?
  • Co się stanie, jeśli automatycznie utworzysz nowy schemat na serwerze CI?
    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

sudo gem install xcodeproj

Następnie napisać prosty skrypt Ruby do ponownego udziału wszystkich schematów, gem ma recreate_user_schemes metody do tego celu

#!/usr/bin/env ruby
require 'xcodeproj'
xcproj = Xcodeproj::Project.open("MyProject.xcodeproj")
xcproj.recreate_user_schemes
xcproj.save

Nie tylko kopiuje pliki schematów z folderu użytkownika do xcshareddata / xcschemes , ale także tworzy te pliki najpierw, analizując plik pbxproj .


1
W przypadku, gdy ktoś się na to natknie, wydaje się, że recreate_user_schemesnie obsługuje on poprawnie celów testowych. Mam złożył raport o błędzie o nim .
Matt Kantor,

Pisałem o tym na blogu. nsbogan.com/xcode/2014/05/29/share-xcode-schemes . Niestety problem z testami jednostkowymi nadal nie został rozwiązany.
i4niac

cóż, wypróbowałem to rozwiązanie. Ale kiedy uruchomiłem 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 dobrze
Ігар Цімошка

2
archivedziałanie zawsze obejmuje podpisywanie, a miejsce docelowe musi być ustawione na prawdziwe urządzenie. W twoim przypadku miejscem docelowym jest iPad 2, jak sądzę, symulator, więc archiwizacja nie jest możliwa. Brakuje jednej ważnej opcji w twoim poleceniu, -sdk iphoneosnajpierw wypróbuj ją i zobacz, jak to działa. Kiedy uruchamiasz go z Xcode IDE, prawdopodobnie masz ustawione miejsce docelowe iOS Devicelub 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.
i4niac

1
To powinno być bardziej przychylne - dziękuję! Projekty Calabash z frameworkami Swift nie mogą zostać zbudowane z XCode6.1.1, ponieważ musisz je zbudować ze schematu. Ten klejnot jest niesamowity.
David


3

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.


1

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.ymlpliku.
Po tym, jak skorzystałeś schemez udostępniania. W Xcode Idź do Products>Scheme>Manage Schemei zaznacz udostępnij, aby udostępnić.

Zmiany

Ustaw bezwzględną ścieżkę wszędzie.
na przykład. xcodebuild clean archive -archivePath /path/to/your/project/build/testDemo -scheme testDemo | xcpretty
tutaj musisz zmienić /path/to/your/project/swoją ścieżkę i testDemonazwę projektu.


0

Mam ten sam problem, ale podczas kompilowania z xcode jako podprojektem głównego. Zbudowano podprojekt w samodzielnym xcode - po tym błąd zniknął.


0

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

wprowadź opis obrazu tutaj

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)

wprowadź opis obrazu tutaj

Obrazy zaczerpnięte z tego artykułu https://developer.nevercode.io/docs/sharing-ios-project-schemes


0

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:

wprowadź opis obrazu tutaj

, z fastlane lanespoprawnym wyświetlaniem wszystkich twoich pasów, w tym wszystkich twoich schematów:

wprowadź opis obrazu tutaj

, ale fastlane gympokazuj tylko główne schematy (nie schematy tworzenia i testowania):

wprowadź opis obrazu tutaj

Rozwiązaniem jest odznaczenie opcji wspólnej dla schematów, których nie ma na liście, fastlane gyma następnie ponowne zaznaczenie . Wygeneruje .xcscheme dla schematów:

wprowadź opis obrazu tutaj

Teraz, jeśli sprawdzisz fastlane gym, wszystkie schematy zostaną wyświetlone:

wprowadź opis obrazu tutaj

Następnie powinieneś zatwierdzić ten plik .xcshemes do repozytorium, aby inny programista, który sklonował projekt, otrzymał pliki.


0

Dla każdego, kto ma Xcode 11.4 i próbuje znaleźć przycisk „Współdzielony” w schemacie, jest teraz przeniesiony do schematu indywidualnego.

  1. Wybierz żądany schemat
  2. Naciśnij „Edytuj”
  3. Zaznacz pole „Udostępnione”

Edycja schematu zawiera teraz udostępnione pudełko

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.