xcodebuild dice che non contiene schema


125

Ho un problema curioso.

Ho un progetto su cui ho lavorato e che ho sempre costruito dall'IDE XCode, e ha funzionato bene. Ora sto configurando Bamboo per costruire il progetto e come tale lo sto costruendo dalla riga di comando.

Il problema è che se controllo il mio codice da GIT e poi uso xcodebuild per crearlo, si dice che lo schema non può essere trovato, ma se apro il progetto, si compila e se poi provo a crearlo di nuovo dalla riga di comando con lo stesso comando funziona.

Che magia sta facendo XCode quando apro il progetto o sto facendo qualcosa di stupido, magari escludendo un file nel mio .gitignore che non dovrei?


Ho appena notato che quando apro il progetto in xcode viene creato un file .xcscheme, ma nella cartella xcuserdata / nomeutente.xcuserdatad ... ma non capisco perché lo schema viene "generato" sotto la cartella degli utenti .. e come sono io lo gestirò in bambù
Zac Tolley

Risposte:


187

Sei decisamente sulla strada giusta rispetto al file .xcscheme: ho riscontrato questo problema durante l'impostazione dei miei progetti!

Per i posteri, o almeno per chiunque sia arrivato qui da una ricerca, ecco due versioni delle cose: la versione "Sono impegnato, quindi solo i fatti per favore" e una discussione più complessa e motivata. Entrambe queste versioni presumono che tu stia tentando di creare da un file Workspace; se non lo sei, mi scuso in quanto applicabile principalmente ai progetti basati sull'area di lavoro.

Versione ridotta "Fix-it"

La causa principale è che il comportamento predefinito di Schemes è mantenere gli schemi "privati" finché non vengono specificatamente contrassegnati come condivisi. Nel caso di una compilazione avviata dalla riga di comando, l'interfaccia utente di Xcode non viene mai eseguita e lo strumento xcoderun non dispone della propria cache di schemi con cui lavorare. L'obiettivo è generare, condividere e eseguire il commit dello schema che desideri venga eseguito da Bamboo:

  1. Su una copia pulita e funzionante del codice, apri l'area di lavoro del tuo progetto.
  2. Scegli Schema> Gestisci schemi ... dal menu Prodotto.
  3. Viene visualizzato l'elenco degli schemi definiti per il progetto.
  4. Individua lo schema che Bamboo sta tentando di eseguire
  5. Assicurati che la casella "Condiviso" sia selezionata per quello schema e che l'impostazione "Contenitore" sia impostata sull'area di lavoro e non sul file di progetto stesso.
  6. Fare clic su "OK" per chiudere il foglio Gestisci schemi.
  7. Un nuovo file .xcscheme è stato creato nel tuo progetto in WorkspaceName.xcworkspace / xcshareddata / xcschemes.
  8. Salva questo file nel tuo repository ed esegui una build Bamboo.

Discussione più approfondita e motivazione

Xcode 4 ha introdotto Workspaces and Schemes come un modo per cercare di domare un po 'del caos inerente alla gestione dei meccanismi di cablaggio di progetti Xcode correlati, creazione di obiettivi e costruzione di configurazioni insieme. L'area di lavoro stessa ha il proprio set di dati di configurazione che descrive ciascuna delle "scatole" più piccole di dati che contiene e funge da scheletro per allegare file .xcodeproj e un set di dati di configurazione condivisi che vengono rispecchiati su ogni macchina dello sviluppatore o sistema CI . Questo è sia il potere che la trappola degli spazi di lavoro: ci sono 1) molti modi in cui si possono configurare le cose al 100% correttamente, ma metterle nel contenitore sbagliato o 2) metterle nel contenitore corretto, ma configurate in modo improprio, rendendo così i dati inaccessibile da altre parti del sistema!

Il comportamento predefinito degli schemi Xcode 4 consiste nel generare automaticamente nuovi schemi quando i progetti vengono aggiunti al file Workspace. Quelli di voi che hanno aggiunto diversi file .xcodeproj potrebbero aver notato che il proprio elenco di schemi diventa rapidamente indisciplinato soprattutto quando i file di progetto vengono aggiunti, quindi rimossi e quindi reinseriti nello stesso spazio di lavoro. Tutti gli schemi, generati automaticamente o creati manualmente, per impostazione predefinita sono schemi "privati" visibili solo all'utente corrente anche quando i file .xcuserdata vengono salvati con i dati e la configurazione del progetto. Questa è la causa principale di quell'errore di compilazione criptico che Bamboo riporta da xcodebuild - Poiché Bamboo gestisce la compilazione tramite la riga di comando e non l'interfaccia utente di Xcode, non ha l'opportunità per gli schemi di essere generati automaticamente e si basa solo su quelli che sono definiti nell'area di lavoro stessa.

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

xcodebuild cerca il file <'scheme' Parameter Value> .xcscheme esistente in <'workspace' Parameter Value> / xcshareddata / xcschemes.

Ovviamente ci sono molti modi in cui è possibile configurare sia Bamboo che un'area di lavoro, quindi tieni presente che la tua configurazione unica potrebbe non mappare al 100% ciò che viene presentato qui. I punti chiave:

  1. Alcune attività automatizzate di cui si occupa magicamente l'interfaccia utente di Xcode non sono disponibili tramite la CLI di Xcodebuild.
  2. Puoi allegare schemi e creare dati di configurazione in molti punti della "gerarchia del contenitore": assicurati che i tuoi dati finiscano nel contenitore corretto (area di lavoro, progetto e / o destinazione della build)
  3. Considera dove nella gerarchia del contenitore lo strumento xcodebuild potrebbe cercare i dati di configurazione; un ottimo indicatore di dove inizierà a cercare è basato sull'uso degli argomenti "-workspace" o "-project".

La casella "Condiviso" è già selezionata ... e adesso?

Ho riscontrato lo stesso problema sulla mia istanza Bamboo; si è scoperto che lo schema che era stato eseguito il commit nel mio repository era obsoleto e l'ultima versione degli strumenti della riga di comando non lo gestiva con garbo. Dal momento che esisteva in precedenza, ho esaminato le impostazioni per assicurarmi che non ci fosse nulla di evidentemente personalizzato sullo schema, ho eliminato e ricreato lo schema assicurandomi di averlo contrassegnato come "Condiviso" e ricominciando il nuovo file .xcscheme nel repository.

Se tutto sembra a posto e la ricostruzione non risolve il problema, ricontrolla l'impostazione del contenitore: è davvero facile collegare lo schema al contenitore sbagliato nella gerarchia!


Questo in realtà ha risolto un errore casuale di xcodebuild per me che non restituiva errori ma un codice di uscita 65. Si scopre che il contenitore era impostato sul progetto e non sull'area di lavoro stessa, lo ha cambiato e voilà, problema risolto. Grazie.
Simon Lee

Grazie! Questa è esattamente la soluzione che stavo cercando.
raidfive

Le mie opzioni di test e archiviazione sono disabilitate per questo motivo. Ho verificato che il mio schema sia condiviso. non sono ancora in grado di compilare tramite bot. Sono in grado di creare localmente ma come ho detto non posso archiviarlo. Pensi che sia correlato a questo problema
Alix

Grazie! L'impostazione del contenitore dello schema sul mio spazio di lavoro ha risolto i problemi che avevo con le mie build di TeamCity.
Modulo

come individuare lo schema da questo messaggio. Ricevo esattamente questo messaggio. [Xcodebuild: errore: l'area di lavoro denominata "jamesAppV2" non contiene uno schema denominato "". L'opzione "-list" può essere utilizzata per trovare i nomi degli schemi nell'area di lavoro.]
Qadir Hussain

52

Esegui il debug del problema in questo modo:

xcodebuild -list

o se stai utilizzando uno spazio di lavoro (ad es. con pod)

xcodebuild -workspace MyProject.xcworkspace -list

Se il tuo schema non è elencato, correggi in questo modo:

inserisci qui la descrizione dell'immagine


Rendere gli schemi condivisi consente loro di presentarsi in xcodebuild -list... grazie!
Dan Rosenstark

35

La maggior parte delle risposte ti suggerirebbe di rendere il tuo schema condiviso usando Xcode, quindi eseguire il commit delle modifiche al repository. Funziona, ovviamente, ma solo se hai accesso al codice sorgente e hai i diritti per eseguire il commit delle modifiche e un paio di altri presupposti.

Ma c'è una serie di " cosa succede se " da considerare

  • E se per qualche motivo non fosse possibile modificare il progetto Xcode?
  • Cosa succede se crei automaticamente un nuovo schema sul server CI?
    Questo in realtà accade abbastanza spesso. Se utilizzi un framework di automazione dei test, come Calabash, normalmente finirai per duplicare un target esistente, che duplica automaticamente anche uno schema, e il nuovo schema non è condiviso, anche se lo schema originale lo era.

Gemma rubino e xcodeproj

Consiglierei di usare xcodeproj Ruby gem. Questo è uno strumento open source davvero interessante che può aiutarti ad automatizzare tonnellate di attività relative a Xcode.

A proposito, questa è la gemma usata da CocoaPods per scherzare con i tuoi progetti e spazi di lavoro Xcode.

Quindi installalo

sudo gem install xcodeproj

Quindi scrivi un semplice script Ruby per ricondividere tutti gli schemi, la gemma ha il metodo recreate_user_schemes per quello scopo

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

Non si limita a copiare i file dello schema dalla cartella dell'utente in xcshareddata / xcschemes , ma crea anche quei file prima analizzando il file pbxproj .


1
Nel caso in cui qualcun altro si imbatta in questo, sembra che recreate_user_schemesnon gestisca correttamente gli obiettivi di test. Ho presentato una segnalazione di bug al riguardo .
Matt Kantor

Ne ho scritto sul blog. nsbogan.com/xcode/2014/05/29/share-xcode-schemes . Purtroppo il problema con gli unit test non è ancora stato risolto.
i4niac

bene, ho provato questa soluzione. Ma quando xcodebuild -project Finance.xcodeproj -scheme "Finance" -configuration Release clean archive CODE_SIGN_IDENTITY="My Identity"eseguo ho ricevuto "Scheme <IDEScheme: 0x7fc9ea5e5fd0:" Finance "> è stato chiesto di compilare e archiviare, ma la destinazione di esecuzione <IDERunDestination: 0x7fc9eb47c6c0: 'iPad 2'> non è una piattaforma di distribuzione e questa azione non dovrebbe avere stato permesso '. Ma quando apro XCode tutto funziona bene
Ігар Цімошка

2
archivel'azione implica sempre la firma e la destinazione deve essere impostata su un dispositivo reale. Nel tuo caso la destinazione è iPad 2, che penso sia un simulatore, quindi non è possibile alcuna archiviazione. C'è un'opzione importante mancante dal tuo comando, è -sdk iphoneosProvalo prima e guarda come va. Quando lo esegui da Xcode IDE, probabilmente hai la destinazione impostata iOS Deviceo forse hai un dispositivo reale collegato in modo che sia impostato come destinazione. Ecco perché l'archiviazione funziona da IDE. La riga di comando è più "stupida" e talvolta può utilizzare opzioni "sbagliate" per impostazione predefinita, quindi è necessario essere più specifici.
i4niac

1
Questo dovrebbe essere votato di più - grazie! I progetti Calabash con framework Swift non vengono compilati con XCode6.1.1 perché devi crearli da uno schema. Questa gemma è fantastica.
David


3

Una ragione comune per la mancanza dello schema è dimenticare di spingere i commit all'origine. Se viene visualizzato un messaggio di schema mancante, è necessario prima verificare che lo schema sia condiviso, quindi verificare di aver eseguito il commit delle modifiche E di averle inviate al server di origine.


1

Ho riscontrato questo errore durante l'implementazione di CI. La domanda precedente è identica ai miei problemi, tranne per il fatto che sto utilizzando lo strumento CI di Gitlab. Puoi verificare se esiste un file di questo tipo in Bamboo.
L'ho risolto apportando alcune modifiche al gitlab-ci.ymlfile.
Dopo aver reso schemedisponibile la condivisione. In Xcode vai a Products>Scheme>Manage Schemee seleziona Condividi per condividere.

I cambiamenti

Imposta il percorso assoluto ovunque.
per esempio. xcodebuild clean archive -archivePath /path/to/your/project/build/testDemo -scheme testDemo | xcpretty
qui devi cambiare /path/to/your/project/con il tuo percorso e testDemocon il nome del tuo progetto.


0

Ho lo stesso problema ma durante la creazione con xcode come sottoprogetto di quello principale. Sottoprogetto costruito in xcode standalone - dopodiché questo errore è scomparso.


0

Ho affrontato questo problema e anche se alcune delle risposte qui forniscono effettivamente la soluzione, non l'ho trovata molto chiara. Quindi ne aggiungerò solo un altro. In poche parole come condividere uno schema da excode.

Passare a Product> Scheme>Manage Schemes

inserisci qui la descrizione dell'immagine

Ti verrà quindi mostrato un elenco di schemi, ciascuno indicato come condiviso o meno. Controlla solo quelli che vuoi condividere (potrebbero essere diversi per le build di sviluppo e produzione)

inserisci qui la descrizione dell'immagine

Immagini tratte da questo articolo https://developer.nevercode.io/docs/sharing-ios-project-schemes


0

Voglio aggiungere una soluzione per il mio caso relativo a questo thread. Questo è per te che cloni il progetto esistente, con tutti gli schemi di cui hai bisogno sono già condivisi:

inserisci qui la descrizione dell'immagine

, con fastlane lanesvisualizzare correttamente tutte le tue corsie compresi tutti i tuoi schemi:

inserisci qui la descrizione dell'immagine

, ma fastlane gymmostra solo gli schemi principali (non gli schemi di sviluppo e test):

inserisci qui la descrizione dell'immagine

La soluzione è deselezionare l'opzione condivisa per gli schemi non elencati da fastlane gyme quindi ricontrollarla . Genererà .xcscheme per gli schemi:

inserisci qui la descrizione dell'immagine

Ora, se controlli con fastlane gym, verranno elencati tutti gli schemi:

inserisci qui la descrizione dell'immagine

Quindi dovresti eseguire il commit di quei file .xcshemes nel repository, così gli altri sviluppatori che clonano il progetto otterranno i file.


0

Per chiunque abbia Xcode 11.4 che cerchi di trovare il pulsante "Condiviso" nello schema, ora viene spostato nello schema individuale.

  1. Seleziona lo schema che desideri
  2. Premi "Modifica"
  3. Seleziona la casella "Condiviso"

La modifica dello schema contiene la casella condivisa ora

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.