xcodebuild dit ne contient pas de schéma

125

J'ai un problème de curiosité.

J'ai un projet sur lequel j'ai travaillé et toujours construit à partir de l'IDE XCode, et cela a bien fonctionné. Maintenant, je configure Bamboo pour construire le projet et en tant que tel, je le construis à partir de la ligne de commande.

Le problème est que si je vérifie mon code hors de GIT puis que j'utilise xcodebuild pour le construire, cela indique que le schéma ne peut pas être trouvé, mais si j'ouvre le projet, il se construit et si j'essaye de le construire à nouveau à partir de la ligne de commande avec la même commande, ça marche.

Quelle magie fait XCode lorsque j'ouvre le projet ou est-ce que je fais quelque chose de stupide, peut-être en excluant un fichier dans mon .gitignore que je ne devrais pas?

Zac Tolley
la source
Je viens de remarquer que lorsque j'ouvre le projet dans xcode, je crée un fichier .xcscheme, mais dans le dossier xcuserdata / username.xcuserdatad ... mais je ne comprends pas pourquoi le schéma est `` généré '' sous le dossier des utilisateurs ... et comment suis-je va gérer ça en bambou
Zac Tolley

Réponses:

187

Vous êtes définitivement sur la bonne voie en ce qui concerne le fichier .xcscheme - j'ai eu ce problème lors de la configuration de mes propres projets!

Pour la postérité, ou du moins pour quiconque vient ici d'une recherche, voici deux versions des choses - la version «Je suis occupé, donc juste les faits s'il vous plaît» et une discussion et une justification plus complexes. Ces deux versions supposent que vous essayez de créer à partir d'un fichier Workspace; si ce n'est pas le cas, je m'excuse car cela s'applique principalement aux projets basés sur l'espace de travail.

Version condensée 'Fix-it'

La cause première est que le comportement par défaut des schémas est de garder les schémas «privés» jusqu'à ce qu'ils soient spécifiquement marqués comme partagés. Dans le cas d'une génération initiée par la ligne de commande, l'interface utilisateur Xcode ne s'exécute jamais et l'outil xcoderun n'a pas son propre cache de schémas avec lequel travailler. L'objectif est de générer, partager et valider le schéma que vous souhaitez que Bamboo exécute:

  1. Sur une copie de travail propre du code, ouvrez l'espace de travail de votre projet.
  2. Choisissez Schéma> Gérer les schémas ... dans le menu Produit.
  3. La liste des schémas définis pour le projet apparaît.
  4. Localisez le schéma que Bamboo essaie d'exécuter
  5. Assurez-vous que la case «Partagé» est cochée pour ce schéma et que le paramètre «Conteneur» est défini sur l'espace de travail et non sur le fichier de projet lui-même.
  6. Cliquez sur «OK» pour fermer la feuille Gérer les schémas.
  7. Un nouveau fichier .xcscheme a été créé dans votre projet sous WorkspaceName.xcworkspace / xcshareddata / xcschemes.
  8. Validez ce fichier dans votre référentiel et exécutez une version Bamboo.

Discussion et justification plus approfondies

Xcode 4 a présenté les espaces de travail et les schémas comme un moyen d'aider à essayer d'apprivoiser une partie du chaos inhérent à la gestion des mécanismes de câblage des projets Xcode liés, de créer des cibles et de construire des configurations ensemble. L'espace de travail lui-même a son propre ensemble de données de configuration qui décrit chacune des plus petites `` boîtes '' de données qu'il contient et agit comme un squelette pour attacher des fichiers .xcodeproj et un ensemble de données de configuration partagées qui sont reflétées sur chaque machine de développeur ou système CI . C'est à la fois la puissance et le piège des espaces de travail - il y a 1) de nombreuses façons dont on peut configurer les choses correctement à 100%, mais les mettre dans le mauvais conteneur ou 2) les placer dans le bon conteneur, mais mal configuré, ce qui rend les données inaccessible par d'autres parties du système!

Le comportement par défaut des schémas Xcode 4 est de générer automatiquement de nouveaux schémas à mesure que les projets sont ajoutés au fichier Workspace. Ceux d'entre vous qui ont ajouté plusieurs fichiers .xcodeproj ont peut-être remarqué que votre liste de schémas devient rapidement indisciplinée, d'autant plus que les fichiers de projet sont ajoutés, puis supprimés, puis lus dans le même espace de travail. Tous les schémas, générés automatiquement ou créés manuellement, sont par défaut des schémas «privés» visibles uniquement par l'utilisateur actuel, même lorsque les fichiers .xcuserdata sont validés avec les données et la configuration du projet. C'est la cause première de cette erreur de construction cryptique. Bamboo rapporte de xcodebuild - Étant donné que Bamboo exploite la construction via la ligne de commande et non l'interface utilisateur Xcode, il n'a pas la possibilité pour les schémas d'être générés automatiquement et ne repose que sur ceux qui sont définis dans l'espace de travail lui-même.

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

xcodebuild recherche le fichier <Valeur du paramètre 'schéma'> .xcscheme existant dans <Valeur du paramètre 'espace de travail'> / xcshareddata / xcschemes.

De toute évidence, il existe de nombreuses façons de configurer à la fois Bamboo et un espace de travail, alors gardez à l'esprit que votre configuration unique peut ne pas correspondre à 100% à ce qui est présenté ici. Les principaux points à retenir:

  1. Certaines tâches automatisées prises en charge par l'interface utilisateur Xcode par magie ne sont pas disponibles via l'interface de ligne de commande Xcodebuild.
  2. Vous pouvez attacher un schéma et créer des données de configuration à de nombreux endroits dans la `` hiérarchie de conteneurs '' - Assurez-vous que vos données se retrouvent dans le bon conteneur (espace de travail, projet et / ou cible de construction)
  3. Considérez où dans la hiérarchie des conteneurs l'outil xcodebuild peut rechercher des données de configuration; un excellent indicateur de l'endroit où il commencera à chercher est basé sur l'utilisation des arguments «-workspace» ou «-project».

La case «Partagé» est déjà cochée ... et maintenant?

J'ai rencontré ce même problème sur ma propre instance Bamboo; il s'est avéré que le schéma qui était engagé dans mon référentiel était obsolète et que la dernière version des outils de ligne de commande ne le gérait pas correctement. Comme cela existait auparavant, j'ai jeté un coup d'œil dans les paramètres pour m'assurer qu'il n'y avait rien de vraiment personnalisé dans le schéma, j'ai supprimé et recréé le schéma en veillant à le marquer comme `` partagé '', et en réengageant le nouveau fichier .xcscheme au dépôt.

Si tout semble bon et que la reconstruction ne résout pas le problème, vérifiez à nouveau ce paramètre de conteneur - il est vraiment facile d'attacher ce schéma au mauvais conteneur dans la hiérarchie!

Bryan Musial
la source
Cela a en fait corrigé une erreur xcodebuild aléatoire pour moi qui ne renvoyait AUCUNE erreur mais un code de sortie 65. Il s'avère que le conteneur a été défini sur le projet et non sur l'espace de travail lui-même, l'a changé et voilà, le problème est résolu. Merci.
Simon Lee
Merci! C'est exactement la solution que je recherchais.
raidfive
Mon option de test et d'archivage est désactivée à cause de cela. J'ai vérifié que mon schéma est partagé. toujours pas en mesure de construire via bot.Je suis capable de construire localement mais comme je l'ai mentionné, je ne peux pas l'archiver. Pensez-vous que c'est lié à ce problème
Alix
Merci! La définition du conteneur de schéma sur mon espace de travail a résolu les problèmes que j'avais avec mes builds TeamCity.
Formulaire du
comment localiser le schéma à partir de ce message. Je reçois exactement ce message. [Xcodebuild: erreur: L'espace de travail nommé "jamesAppV2" ne contient pas de schéma nommé "". L'option "-list" peut être utilisée pour trouver les noms des schémas dans l'espace de travail.]
Qadir Hussain
52

Déboguez le problème comme ceci:

xcodebuild -list

ou si vous utilisez un espace de travail (par exemple avec des pods)

xcodebuild -workspace MyProject.xcworkspace -list

Si votre schéma n'est pas répertorié, procédez comme suit:

entrez la description de l'image ici

Robert
la source
Rendre les schémas partagés leur permet de se présenter xcodebuild -list... merci!
Dan Rosenstark
35

La plupart des réponses vous suggèrent de partager votre schéma à l'aide de Xcode, puis de valider les modifications dans le dépôt. Cela fonctionne, bien sûr, mais uniquement si vous avez accès au code source et avez le droit de valider les modifications, et quelques autres hypothèses.

Mais il y a un certain nombre de «et si » à considérer

  • Que faire si vous ne pouvez tout simplement pas modifier le projet Xcode pour une raison quelconque?
  • Que faire si vous créez un nouveau schéma automatiquement sur le serveur CI?
    Cela arrive en fait assez souvent. Si vous utilisez un framework d'automatisation de test, comme Calabash, vous finirez normalement par dupliquer une cible existante, qui duplique également automatiquement un schéma, et le nouveau schéma n'est pas partagé, même si le schéma d'origine l'était.

Gemme Ruby & Xcodeproj

Je recommanderais d'utiliser xcodeproj Ruby gem. C'est un outil open source vraiment cool qui peut vous aider à automatiser des tonnes de tâches liées à Xcode.

Btw, c'est le joyau utilisé par CocoaPods pour jouer avec vos projets et espaces de travail Xcode.

Alors installez-le

sudo gem install xcodeproj

Ensuite, écrivez un simple script Ruby pour re-partager tous les schémas, le gem a la méthode receate_user_schemes à cet effet

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

Il ne copie pas seulement les fichiers de schéma du dossier de l'utilisateur dans xcshareddata / xcschemes , il crée également ces fichiers d'abord en analysant le fichier pbxproj .

i4niac
la source
1
Au cas où quelqu'un d'autre trébucherait sur cela, il semble que recreate_user_schemescela ne gère pas correctement les cibles de test. J'ai déposé un rapport de bogue à ce sujet .
Matt Kantor
J'ai blogué à ce sujet. nsbogan.com/xcode/2014/05/29/share-xcode-schemes . Malheureusement, le problème des tests unitaires n'est toujours pas résolu.
i4niac
eh bien, j'ai essayé cette solution. Mais quand je lance, xcodebuild -project Finance.xcodeproj -scheme "Finance" -configuration Release clean archive CODE_SIGN_IDENTITY="My Identity"j'ai demandé à Scheme <IDEScheme: 0x7fc9ea5e5fd0: 'Finance'> de construire et d'archiver, mais la destination d'exécution <IDERunDestination: 0x7fc9eb47c6c0: 'iPad 2'> n'est pas une plate-forme de déploiement et cette action ne devrait pas avoir été autorisé ». Mais quand j'ouvre XCode, tout fonctionne bien
Ігар Цімошка
2
archivel'action implique toujours la signature et la destination doit être définie sur un appareil réel. Dans votre cas, la destination est iPad 2, ce que je pense être un simulateur, donc aucun archivage n'est possible. Il manque une option importante dans votre commande, c'est -sdk iphoneosEssayez d'abord et voyez comment cela se passe. Lorsque vous l'exécutez à partir de Xcode IDE, vous avez probablement défini la destination iOS Deviceou peut-être avez-vous un périphérique réel branché pour qu'il soit défini comme destination. C'est pourquoi l'archivage fonctionne à partir de l'IDE. La ligne de commande est plus «stupide» et peut parfois utiliser des options «incorrectes» par défaut, vous devez donc être plus précis.
i4niac
1
Cela devrait être plus voté - merci! Les projets Calabash avec des frameworks Swift ne parviennent pas à se construire avec XCode6.1.1 car vous devez les construire à partir d'un schéma. Ce bijou est génial.
David
3

Une raison courante pour laquelle le schéma manque est d'oublier de pousser les commits à l'origine. Si vous obtenez un message de schéma manquant, vous devez d'abord vérifier que le schéma est partagé, puis vérifiez que vous avez validé les modifications ET les avez transmises au serveur d'origine.

Eric
la source
1

J'ai eu cette erreur lors de l'implémentation de CI.La question ci-dessus est identique à mes problèmes sauf que j'utilise le propre outil CI de Gitlab.Vous pouvez vérifier s'il existe un tel fichier dans Bamboo.
Je l'ai résolu en apportant quelques modifications au gitlab-ci.ymlfichier.
Après avoir fait votre schemedisponibilité en partageant. Dans Xcode, accédez à Products>Scheme>Manage Schemeet cochez partager pour partager.

Changements

Définissez un chemin absolu partout.
par exemple. xcodebuild clean archive -archivePath /path/to/your/project/build/testDemo -scheme testDemo | xcpretty
ici, vous devez changer /path/to/your/project/avec votre chemin et testDemoavec le nom de votre projet.

Siddhartha S. Ikshavaku
la source
0

J'ai eu le même problème mais lors de la construction avec xcode comme sous-projet du principal. Sous-projet construit en autonome xcode - après cela, cette erreur a disparu.

htzfun
la source
0

J'ai été confronté à ce problème et même si certaines des réponses ici fournissent réellement la solution, je ne l'ai pas trouvée très claire. Je vais donc en ajouter un de plus. En un mot, comment partager un schéma depuis excode.

Accédez à Product> Scheme>Manage Schemes

entrez la description de l'image ici

Vous verrez alors une liste de schémas, chacun étant indiqué comme étant partagé ou non. Cochez simplement ceux que vous souhaitez partager (ils peuvent être différents pour les versions de développement et de production)

entrez la description de l'image ici

Images tirées de cet article https://developer.nevercode.io/docs/sharing-ios-project-schemes

Carlos Robles
la source
0

Je souhaite ajouter une solution pour mon cas lié à ce fil. Celui-ci est pour vous qui clonez un projet existant, avec tous les schémas dont vous avez besoin sont déjà partagés:

entrez la description de l'image ici

, avec fastlane lanesafficher correctement toutes vos voies y compris tous vos schémas:

entrez la description de l'image ici

, mais fastlane gymaffiche uniquement les schémas principaux (pas les schémas de développement et de test):

entrez la description de l'image ici

La solution consiste à décocher l'option partagée pour les schémas non répertoriés par fastlane gym, puis à la cocher à nouveau . Il générera .xcscheme pour les schémas:

entrez la description de l'image ici

Maintenant, si vous vérifiez avec fastlane gym, tous les schémas seront listés:

entrez la description de l'image ici

Ensuite, vous devez valider ces fichiers .xcshemes dans le référentiel, afin que les autres développeurs qui clonent le projet obtiennent les fichiers.

Seto Elkahfi
la source
0

Pour toute personne avec Xcode 11.4 essayant de trouver le bouton "Partagé" sur le schéma, il est maintenant déplacé dans le schéma individuel.

  1. Sélectionnez le schéma souhaité
  2. Appuyez sur "Modifier"
  3. Cochez la case "Partagé"

La modification du schéma contient désormais une boîte partagée

green0range
la source