xcodebuild sagt, enthält kein Schema

125

Ich habe ein Kuriositätenproblem.

Ich habe ein Projekt, an dem ich gearbeitet habe und das immer aus der XCode-IDE erstellt wurde, und es hat gut funktioniert. Jetzt richte ich Bamboo ein, um das Projekt zu erstellen, und als solches baue ich es über die Befehlszeile.

Das Problem ist, wenn ich meinen Code aus GIT auschecke und ihn dann mit xcodebuild erstelle, heißt es, dass das Schema nicht gefunden werden kann. Wenn ich das Projekt öffne, wird es erstellt und wenn ich dann versuche, es erneut über die Befehlszeile zu erstellen mit dem gleichen Befehl funktioniert es.

Welche Magie macht XCode, wenn ich das Projekt öffne oder mache ich etwas Dummes, vielleicht eine Datei in meinem .gitignore auszuschließen, die ich nicht sollte?

Zac Tolley
quelle
Ich habe gerade bemerkt, dass beim Öffnen des Projekts in xcode eine .xcscheme-Datei erstellt wird, jedoch im Ordner xcuserdata / username.xcuserdatad ... aber ich verstehe nicht, warum das Schema unter dem Benutzerordner "generiert" wird. Und wie geht es mir? Ich werde das in Bambus erledigen
Zac Tolley

Antworten:

186

In Bezug auf die .xcscheme-Datei sind Sie definitiv auf dem richtigen Weg - dieses Problem trat beim Einrichten meiner eigenen Projekte auf!

Für die Nachwelt oder zumindest für jeden, der von einer Suche hierher kommt, gibt es zwei Versionen von Dingen - die Version "Ich bin beschäftigt, also bitte nur die Fakten" und eine ausführlichere Diskussion und Begründung. In beiden Versionen wird davon ausgegangen, dass Sie versuchen, aus einer Workspace-Datei zu erstellen. Wenn Sie dies nicht tun, entschuldige ich mich, da dies hauptsächlich für arbeitsplatzbasierte Projekte gilt.

Verkürzte 'Fix-it'-Version

Die Hauptursache ist, dass das Standardverhalten von Schemata darin besteht, Schemata "privat" zu halten, bis sie speziell als gemeinsam gekennzeichnet markiert sind. Bei einem von der Befehlszeile initiierten Build wird die Xcode-Benutzeroberfläche nie ausgeführt und das xcoderun-Tool verfügt nicht über einen eigenen Schema-Cache, mit dem gearbeitet werden kann. Das Ziel besteht darin, das Schema zu generieren, zu teilen und festzuschreiben, das Bamboo ausführen soll:

  1. Öffnen Sie auf einer sauberen Arbeitskopie des Codes den Arbeitsbereich Ihres Projekts.
  2. Wählen Sie im Produktmenü "Schema"> "Schemata verwalten".
  3. Die Liste der für das Projekt definierten Schemata wird angezeigt.
  4. Suchen Sie das Schema, das Bamboo ausführen möchte
  5. Stellen Sie sicher, dass das Kontrollkästchen "Freigegeben" für dieses Schema aktiviert ist und dass die Einstellung "Container" auf den Arbeitsbereich und nicht auf die Projektdatei selbst festgelegt ist.
  6. Klicken Sie auf "OK", um das Blatt "Schemata verwalten" zu schließen.
  7. Eine neue .xcscheme-Datei wurde in Ihrem Projekt unter WorkspaceName.xcworkspace / xcshareddata / xcschemes erstellt.
  8. Übernehmen Sie diese Datei in Ihr Repository und führen Sie einen Bamboo-Build aus.

Tiefere Diskussion und Begründung

Xcode 4 führte Arbeitsbereiche und Schemata ein, um das Chaos zu zähmen, das mit der Mechanik der Verkabelung von Xcode-Projekten, dem Erstellen von Zielen und dem gemeinsamen Erstellen von Konfigurationen verbunden ist. Der Arbeitsbereich selbst verfügt über einen eigenen Satz von Konfigurationsdaten, der jedes der darin enthaltenen kleineren Datenfelder beschreibt und als Grundgerüst für das Anhängen von .xcodeproj-Dateien und einen Satz gemeinsam genutzter Konfigurationsdaten dient, die auf jeden Entwicklercomputer oder jedes CI-System gespiegelt werden . Dies ist sowohl die Leistung als auch die Gefahr von Arbeitsbereichen - es gibt 1) viele Möglichkeiten, wie Dinge zu 100% korrekt konfiguriert, aber in den falschen Container gestellt oder 2) in den richtigen Container gestellt, aber nicht richtig konfiguriert werden können, wodurch Daten gerendert werden für andere Teile des Systems nicht zugänglich!

Das Standardverhalten von Xcode 4-Schemata besteht darin, automatisch neue Schemata zu generieren, wenn Projekte zur Workspace-Datei hinzugefügt werden. Diejenigen unter Ihnen, die mehrere .xcodeproj-Dateien hinzugefügt haben, haben möglicherweise bemerkt, dass Ihre Schemaliste schnell unruhig wird, insbesondere wenn Projektdateien hinzugefügt, dann entfernt und dann in denselben Arbeitsbereich eingelesen werden. Alle automatisch generierten oder manuell erstellten Schemata sind standardmäßig "private" Schemata, die nur für den aktuellen Benutzer sichtbar sind, selbst wenn .xcuserdata-Dateien mit den Daten und der Konfiguration des Projekts festgeschrieben werden. Dies ist die Hauptursache für diesen kryptischen Build-Fehler, den Bamboo von xcodebuild meldet. Da Bamboo den Build über die Befehlszeile und nicht über die Xcode-Benutzeroberfläche ausführt, haben Schemes keine Möglichkeit, automatisch generiert zu werden, und verlassen sich nur auf diese werden im Arbeitsbereich selbst definiert.

xcodebuild -workspace MyWorkspace.xcworkspace -scheme MyApplication -configuration Debug

xcodebuild sucht nach der Datei <'Schema' Parameterwert> .xcscheme, die unter <'Arbeitsbereich' Parameterwert> / xcshareddata / xcschemes vorhanden ist.

Offensichtlich gibt es eine Reihe von Möglichkeiten, wie Sie sowohl Bamboo als auch einen Arbeitsbereich konfigurieren können. Denken Sie also daran, dass Ihre eindeutige Konfiguration möglicherweise nicht zu 100% dem entspricht, was hier dargestellt wird. Die wichtigsten Imbissbuden:

  1. Bestimmte automatisierte Aufgaben, die die Xcode-Benutzeroberfläche auf magische Weise erledigt, sind über die Xcodebuild-CLI nicht verfügbar.
  2. Sie können Schema- und Build-Konfigurationsdaten an viele Stellen in der 'Containerhierarchie' anhängen. - Stellen Sie sicher, dass Ihre Daten im richtigen Container (Arbeitsbereich, Projekt und / oder Build-Ziel) gespeichert werden.
  3. Überlegen Sie, wo in der Containerhierarchie das xcodebuild-Tool möglicherweise nach Konfigurationsdaten sucht. Ein guter Indikator dafür, wo es zu suchen beginnt, basiert auf der Verwendung der Argumente '-workspace' oder '-project'.

Das Kontrollkästchen "Geteilt" ist bereits aktiviert ... was nun?

Ich bin auf dasselbe Problem bei meiner eigenen Bamboo-Instanz gestoßen. Es stellte sich heraus, dass das in meinem Repository festgeschriebene Schema veraltet war und die neueste Version der Befehlszeilentools es nicht ordnungsgemäß handhabte. Da dies zuvor vorhanden war, habe ich die Einstellungen durchgesehen, um sicherzustellen, dass das Schema nicht besonders benutzerdefiniert ist. Ich habe das Schema gelöscht und neu erstellt, um sicherzustellen, dass ich es als "Freigegeben" markiert habe, und die neue .xcscheme-Datei erneut in das Schema übernommen Repository.

Wenn alles gut aussieht und die Neuerstellung das Problem nicht löst, überprüfen Sie die Containereinstellung noch einmal - es ist wirklich einfach, dieses Schema an den falschen Container in der Hierarchie anzuhängen!

Bryan Musial
quelle
Dies hat tatsächlich einen zufälligen xcodebuild-Fehler für mich behoben, der KEINE Fehler, sondern einen Exit-Code 65 zurückgab. Es stellte sich heraus, dass der Container auf das Projekt und nicht auf den Arbeitsbereich selbst eingestellt war, es geändert und voila, Problem gelöst. Vielen Dank.
Simon Lee
Vielen Dank! Dies ist genau die Lösung, nach der ich gesucht habe.
Raidfive
MEINE Test- und Archivierungsoption ist aus diesem Grund deaktiviert. Ich habe überprüft, ob mein Schema geteilt wird. Ich kann lokal bauen, aber wie gesagt, ich kann es nicht archivieren. Denken Sie, dass es mit diesem Problem zusammenhängt
Alix
Vielen Dank! Durch das Festlegen des Schema-Containers für meinen Arbeitsbereich wurden die Probleme behoben, die ich mit meinen TeamCity-Builds hatte.
Form
So finden Sie das Schema anhand dieser Nachricht. Ich erhalte genau diese Nachricht. [Xcodebuild: Fehler: Der Arbeitsbereich mit dem Namen "jamesAppV2" enthält kein Schema mit dem Namen "". Die Option "-list" kann verwendet werden, um die Namen der Schemata im Arbeitsbereich zu finden.]
Qadir Hussain
52

Debuggen Sie das Problem wie folgt:

xcodebuild -list

oder wenn Sie einen Arbeitsbereich verwenden (z. B. mit Pods)

xcodebuild -workspace MyProject.xcworkspace -list

Wenn Ihr Schema nicht aufgeführt ist, beheben Sie Folgendes:

Geben Sie hier die Bildbeschreibung ein

Robert
quelle
Wenn sie die Schemata gemeinsam nutzen, können sie in xcodebuild -list... Danke!
Dan Rosenstark
35

Die meisten Antworten schlagen vor, dass Sie Ihr Schema mit Xcode freigeben und dann Änderungen an Repo festschreiben. Das funktioniert natürlich, aber nur, wenn Sie Zugriff auf den Quellcode haben und Rechte zum Festschreiben von Änderungen sowie einige andere Annahmen haben.

Aber es gibt eine Reihe von " Was wäre wenn " zu berücksichtigen

  • Was ist, wenn Sie das Xcode-Projekt aus irgendeinem Grund nicht ändern können?
  • Was ist, wenn Sie automatisch ein neues Schema auf dem CI-Server erstellen?
    Das passiert eigentlich ziemlich oft. Wenn Sie ein Testautomatisierungsframework wie Calabash verwenden, duplizieren Sie normalerweise ein vorhandenes Ziel, wodurch auch ein Schema automatisch dupliziert wird, und das neue Schema wird nicht freigegeben, selbst wenn das ursprüngliche Schema verwendet wurde.

Ruby & xcodeproj gem

Ich würde empfehlen, xcodeproj Ruby gem zu verwenden. Dies ist ein wirklich cooles Open Source-Tool, mit dem Sie Tonnen von Xcode-bezogenen Aufgaben automatisieren können.

Übrigens ist dies das Juwel, das CocoaPods verwendet , um mit Ihren Xcode-Projekten und Arbeitsbereichen herumzuspielen .

Also installiere es

sudo gem install xcodeproj

Schreiben Sie dann ein einfaches Ruby-Skript, um alle Schemata erneut freizugeben. Zu diesem Zweck verfügt das Juwel über die Methode recreate_user_schemes

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

Es kopiert nicht nur Schemadateien aus dem Benutzerordner nach xcshareddata / xcschemes , sondern erstellt diese Dateien auch zuerst, indem die Datei pbxproj analysiert wird.

i4niac
quelle
1
Falls jemand anderes darüber stolpert, scheint es, dass recreate_user_schemesTestziele nicht richtig behandelt werden. Ich habe eingereicht einen Fehlerbericht darüber .
Matt Kantor
Ich habe darüber gebloggt. nsbogan.com/xcode/2014/05/29/share-xcode-schemes . Leider ist das Problem mit Unit-Tests immer noch nicht behoben.
i4niac
Nun, ich habe diese Lösung ausprobiert. Beim Ausführen wurde xcodebuild -project Finance.xcodeproj -scheme "Finance" -configuration Release clean archive CODE_SIGN_IDENTITY="My Identity"jedoch "Schema <IDEScheme: 0x7fc9ea5e5fd0: 'Finanzen'> zum Erstellen und Archivieren aufgefordert, aber das Ausführungsziel <IDERunDestination: 0x7fc9eb47c6c0: 'iPad 2'> ist keine Bereitstellungsplattform, und diese Aktion sollte nicht vorhanden sein." erlaubt worden '. Aber wenn ich XCode öffne, funktioniert alles gut
Ігар Цімошка
2
archiveDie Aktion beinhaltet immer das Signieren und das Ziel muss auf ein reales Gerät eingestellt sein. In Ihrem Fall ist iPad 2das Ziel , was ich für einen Simulator halte, daher ist keine Archivierung möglich. In Ihrem Befehl fehlt eine wichtige Option: -sdk iphoneosVersuchen Sie es zuerst und sehen Sie, wie es geht. Wenn Sie es über die Xcode-IDE ausführen, ist wahrscheinlich das Ziel festgelegt, iOS Deviceoder Sie haben ein echtes Gerät angeschlossen, sodass es als Ziel festgelegt ist. Deshalb funktioniert die Archivierung über IDE. Die Befehlszeile ist "dummer" und kann manchmal standardmäßig "falsche" Optionen verwenden, sodass Sie genauer sein müssen.
i4niac
1
Dies sollte mehr positiv bewertet werden - danke! Calabash-Projekte mit Swift-Frameworks können nicht mit XCode6.1.1 erstellt werden, da Sie sie aus einem Schema erstellen müssen. Dieses Juwel ist fantastisch.
David
9

Ok, ich weiß, dass es 2 Minuten später ist, aber ich habe einen weiteren Stapelüberlauf gefunden, der besagt, dass das Schema auf freigegeben gesetzt werden muss ... Wo speichert Xcode 4 Schemadaten?

Zac Tolley
quelle
3

Ein häufiger Grund für das Fehlen des Schemas ist das Vergessen, die Commits an den Ursprung zu verschieben. Wenn Sie eine fehlende Schemameldung erhalten, sollten Sie zuerst überprüfen, ob das Schema freigegeben ist, und dann überprüfen, ob Sie die Änderungen festgeschrieben UND auf den Ursprungsserver übertragen haben.

Eric
quelle
1

Ich hatte diesen Fehler bei der Implementierung von CI. Die obige Frage ist identisch mit meinen Problemen, außer dass ich Gitlabs eigenes CI-Tool verwende. Sie können überprüfen, ob es eine solche Datei in Bamboo gibt.
Ich habe es gelöst, indem ich einige Änderungen an der gitlab-ci.ymlDatei vorgenommen habe.
Nachdem Sie Ihr schemeAngebot durch Teilen gemacht haben. Gehen Sie in Xcode zu Products>Scheme>Manage SchemeFreigabe und aktivieren Sie diese.

Änderungen

Stellen Sie überall den absoluten Pfad ein.
z.B. xcodebuild clean archive -archivePath /path/to/your/project/build/testDemo -scheme testDemo | xcpretty
Hier müssen Sie /path/to/your/project/Ihren Pfad und testDemoIhren Projektnamen ändern .

Siddhartha S. Ikshavaku
quelle
0

Habe das gleiche Problem aber beim Erstellen mit xcode als Teilprojekt des Hauptprojekts. Erstelltes Teilprojekt in xcode Standalone - danach verschwand dieser Fehler.

htzfun
quelle
0

Ich war mit diesem Problem konfrontiert, und selbst wenn einige der Antworten hier tatsächlich die Lösung bieten, fand ich es nicht sehr klar. Also werde ich noch einen hinzufügen. Kurz gesagt, wie man ein Schema von excode teilt.

Navigieren Sie zu Product> Scheme>Manage Schemes

Geben Sie hier die Bildbeschreibung ein

Anschließend wird eine Liste von Schemata angezeigt, von denen jedes als freigegeben oder nicht freigegeben gekennzeichnet ist. Überprüfen Sie einfach diejenigen, die Sie teilen möchten (es können unterschiedliche für Entwickler- und Produkt-Builds sein).

Geben Sie hier die Bildbeschreibung ein

Bilder aus diesem Artikel https://developer.nevercode.io/docs/sharing-ios-project-schemes

Carlos Robles
quelle
0

Ich möchte eine Lösung für meinen Fall im Zusammenhang mit diesem Thread hinzufügen. Dieser ist für Sie gedacht, die ein vorhandenes Projekt klonen. Alle benötigten Schemata werden bereits gemeinsam genutzt:

Geben Sie hier die Bildbeschreibung ein

, mit fastlane laneskorrekter Anzeige aller Ihrer Fahrspuren einschließlich aller Ihrer Schemata:

Geben Sie hier die Bildbeschreibung ein

, sondern fastlane gymnur Hauptschemata anzeigen (keine Entwicklungs- und Testschemata):

Geben Sie hier die Bildbeschreibung ein

Die Lösung besteht darin, die gemeinsame Option für Schemata zu deaktivieren, die nicht von aufgeführt sind, fastlane gymund sie dann erneut zu aktivieren . Es wird ein .xcscheme für die Schemata generiert:

Geben Sie hier die Bildbeschreibung ein

Wenn Sie sich jetzt bei erkundigen fastlane gym, werden alle Schemata aufgelistet:

Geben Sie hier die Bildbeschreibung ein

Dann sollten Sie diese .xcshemes-Datei in das Repository übertragen, damit andere Entwickler, die das Projekt klonen, die Dateien erhalten.

Seto Elkahfi
quelle
0

Für alle Benutzer mit Xcode 11.4, die versuchen, die Schaltfläche "Freigegeben" im Schema zu finden, wird sie jetzt in das individuelle Schema verschoben.

  1. Wählen Sie das gewünschte Schema aus
  2. Drücken Sie "Bearbeiten"
  3. Aktivieren Sie das Kontrollkästchen "Freigegeben"

Schema-Bearbeitung enthält jetzt freigegebene Box

green0range
quelle