xcodebuild dice que no contiene esquema

125

Tengo un problema curioso

Tengo un proyecto en el que he trabajado y siempre he creado desde XCode IDE, y funcionó bien. Ahora estoy configurando Bamboo para construir el proyecto y, como tal, lo estoy construyendo desde la línea de comandos.

El problema es que si reviso mi código de GIT y luego uso xcodebuild para compilarlo, dice que no se puede encontrar el esquema, pero si abro el proyecto, se compila y si trato de compilarlo nuevamente desde la línea de comandos con el mismo comando, funciona.

¿Qué magia está haciendo XCode cuando abro el proyecto o estoy haciendo algo tonto, tal vez excluyendo un archivo en mi .gitignore que no debería?

Zac Tolley
fuente
Acabo de notar que cuando abro el proyecto en xcode es crear un archivo .xcscheme, pero en la carpeta xcuserdata / username.xcuserdatad ... pero no entiendo por qué el esquema se 'genera' debajo de la carpeta de usuarios ... y cómo estoy va a manejar eso en bambú
Zac Tolley

Respuestas:

187

Definitivamente está en el camino correcto con respecto al archivo .xcscheme. ¡Apareció este problema al configurar mis propios proyectos!

Para la posteridad, o al menos para cualquiera que llegue aquí desde una búsqueda, aquí hay dos versiones de las cosas: la versión "Estoy ocupado, así que solo los hechos, por favor" y una discusión y justificación más complicada. Ambas versiones suponen que está intentando construir desde un archivo de Workspace; si no es así, mis disculpas, ya que esto se aplica principalmente a proyectos basados ​​en el espacio de trabajo.

Versión condensada 'Fix-it'

La causa raíz es que el comportamiento predeterminado de los esquemas es mantener los esquemas 'privados' hasta que se marquen específicamente como compartidos. En el caso de una compilación iniciada por línea de comandos, la interfaz de usuario de Xcode nunca se ejecuta y la herramienta xcoderun no tiene su propia caché de esquemas para trabajar. El objetivo es generar, compartir y confirmar el esquema que desea que Bamboo ejecute:

  1. En una copia de trabajo limpia del código, abra el espacio de trabajo de su Proyecto.
  2. Elija Esquema> Gestionar esquemas ... en el menú del producto.
  3. Aparece la lista de esquemas definidos para el proyecto.
  4. Busque el esquema que Bamboo está intentando ejecutar
  5. Asegúrese de que la casilla 'Compartido' esté marcada para ese esquema y que la configuración 'Contenedor' esté establecida en el Espacio de trabajo y no en el archivo del proyecto en sí.
  6. Haga clic en 'Aceptar' para cerrar la hoja Administrar esquemas.
  7. Se ha creado un nuevo archivo .xcscheme en su proyecto en WorkspaceName.xcworkspace / xcshareddata / xcschemes.
  8. Confirme este archivo en su repositorio y ejecute una compilación de Bamboo.

Discusión más profunda y justificación

Xcode 4 introdujo Espacios de trabajo y esquemas como una forma de ayudar a tratar de dominar parte del caos inherente a lidiar con la mecánica del cableado de proyectos Xcode relacionados, construir objetivos y construir configuraciones juntos. El espacio de trabajo en sí tiene su propio conjunto de datos de configuración que describe cada uno de los 'cuadros' más pequeños de datos que contiene y actúa como un esqueleto para adjuntar archivos .xcodeproj y un conjunto de datos de configuración compartidos que se refleja en cada máquina de desarrollador o sistema de CI . Esto es tanto el poder como el peligro de los espacios de trabajo: hay 1) muchas formas en que uno puede configurar las cosas al 100% correctamente, pero ponerlas en el contenedor incorrecto o 2) ponerlas en el contenedor correcto, pero configuradas incorrectamente, por lo tanto, la generación de datos inaccesible por otras partes del sistema!

El comportamiento predeterminado de los esquemas Xcode 4 es generar automáticamente nuevos esquemas a medida que los proyectos se agregan al archivo del área de trabajo. Aquellos de ustedes que han agregado varios archivos .xcodeproj pueden haber notado que su lista de esquemas rápidamente se vuelve rebelde, especialmente cuando se agregan, luego se eliminan y luego se vuelven a agregar al mismo espacio de trabajo. Todos los esquemas, autogenerados o creados manualmente, por defecto son esquemas 'privados' visibles solo para el usuario actual, incluso cuando los archivos .xcuserdata se confirman con los datos y la configuración del proyecto. Esta es la causa raíz de ese error de compilación críptico. Bamboo informa desde xcodebuild: debido a que Bamboo opera la compilación a través de la línea de comando y no de la interfaz de usuario de Xcode, no tiene la oportunidad de que los esquemas se generen automáticamente y se basa solo en aquellos que se definen en el propio espacio de trabajo.

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

xcodebuild busca el archivo <'esquema' Valor de parámetro> .xcscheme existente en <'espacio de trabajo' Valor de parámetro> / xcshareddata / xcschemes.

Obviamente, hay un montón de formas en que uno podría configurar Bamboo y un espacio de trabajo, así que tenga en cuenta que su configuración única puede no corresponder al 100% con lo que se presenta aquí. Los puntos clave:

  1. Ciertas tareas automatizadas que la UI de Xcode se encarga mágicamente no están disponibles a través de la CLI de Xcodebuild.
  2. Puede adjuntar datos de configuración de esquema y compilación a muchos lugares en la 'jerarquía de contenedores': asegúrese de que sus datos terminen en el contenedor correcto (Espacio de trabajo, Proyecto y / o Compilar objetivo)
  3. Considere en qué parte de la jerarquía de contenedores la herramienta xcodebuild puede estar buscando datos de configuración; un gran indicador de dónde comenzará a buscar se basa en el uso de argumentos '-workspace' o '-project'.

La casilla 'Compartido' ya está marcada ... ¿y ahora qué?

Encontré este mismo problema en mi propia instancia de Bamboo; Resultó que el esquema que se confirmó en mi repositorio estaba desactualizado y la última versión de las herramientas de línea de comandos no lo estaba manejando con gracia. Como esto existía anteriormente, eché un vistazo a la configuración para asegurarme de que no había nada claramente personalizado sobre el esquema, eliminé y recreé el esquema asegurándome de que lo marqué como 'Compartido' y volví a enviar el nuevo archivo .xcscheme al repositorio.

Si todo se ve bien y la reconstrucción no resuelve el problema, verifique la configuración del contenedor: ¡es realmente fácil vincular ese esquema al contenedor incorrecto en la jerarquía!

Bryan Musial
fuente
Esto realmente solucionó un error aleatorio de xcodebuild para mí que no devolvía ningún error sino un código de salida 65. Resulta que el contenedor se configuró para el proyecto y no para el espacio de trabajo en sí, lo cambió y listo, problema resuelto. Gracias.
Simon Lee
¡Gracias! Esta es exactamente la solución que estaba buscando.
Raidfive
MY Test y la opción de archivo están deshabilitadas debido a esto. He comprobado que mi esquema es compartido. todavía no puedo construir a través de bot. Puedo construir localmente, pero como mencioné no puedo archivarlo. ¿Crees que está relacionado con este problema
Alix
¡Gracias! Establecer el contenedor del esquema en mi espacio de trabajo solucionó los problemas que tenía con mis compilaciones de TeamCity.
Formulario
cómo ubicar el esquema de este mensaje. Recibo exactamente este mensaje. [Xcodebuild: error: El espacio de trabajo llamado "jamesAppV2" no contiene un esquema llamado "". La opción "-list" se puede usar para encontrar los nombres de los esquemas en el espacio de trabajo.]
Qadir Hussain
52

Depure el problema de esta manera:

xcodebuild -list

o si está utilizando un espacio de trabajo (por ejemplo, con pods)

xcodebuild -workspace MyProject.xcworkspace -list

Si su esquema no está en la lista, corrija así:

ingrese la descripción de la imagen aquí

Robert
fuente
Hacer que los esquemas compartidos les permita aparecer en xcodebuild -list... ¡gracias!
Dan Rosenstark
35

La mayoría de las respuestas sugerirían que compartiera su esquema usando Xcode, y luego confirmara los cambios en el repositorio. Eso funciona, por supuesto, pero solo si tiene acceso al código fuente y tiene derechos para cometer cambios, y un par de otras suposiciones.

Pero hay una serie de " qué pasaría si " a tener en cuenta

  • ¿Qué sucede si simplemente no puede modificar el proyecto Xcode por alguna razón?
  • ¿Qué sucede si crea un nuevo esquema automáticamente en el servidor CI?
    Esto realmente sucede con bastante frecuencia. Si utiliza el marco de automatización de prueba, como Calabash, normalmente terminará duplicando un objetivo existente, que también duplica automáticamente un esquema, y ​​el nuevo esquema no se comparte, incluso si el esquema original lo fuera.

Ruby y gema xcodeproj

Yo recomendaría usar xcodeproj gema Ruby. Esta es una herramienta de código abierto realmente genial que puede ayudarlo a automatizar toneladas de tareas relacionadas con Xcode.

Por cierto, esta es la gema utilizada por CocoaPods para con tus proyectos y espacios de trabajo de Xcode.

Así que instálalo

sudo gem install xcodeproj

Luego, escriba un script Ruby simple para volver a compartir todos los esquemas, la gema tiene el método recrete_user_schemes para ese propósito

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

No solo copia los archivos de esquema de la carpeta del usuario a xcshareddata / xcschemes , sino que también crea esos archivos primero al analizar el archivo pbxproj .

i4niac
fuente
1
En caso de que alguien más se encuentre con esto, parece que recreate_user_schemesno maneja los objetivos de prueba correctamente. He presentado un informe de error al respecto .
Matt Kantor
Yo blogueé sobre eso. nsbogan.com/xcode/2014/05/29/share-xcode-schemes . Lamentablemente, el problema con las pruebas unitarias todavía no se ha solucionado.
i4niac
bueno, probé esta solución. Pero cuando xcodebuild -project Finance.xcodeproj -scheme "Finance" -configuration Release clean archive CODE_SIGN_IDENTITY="My Identity"ejecuté, obtuve 'Scheme <IDEScheme: 0x7fc9ea5e5fd0:' Finance '> se le pidió que compilara y archivara, pero el destino de ejecución <IDERunDestination: 0x7fc9eb47c6c0:' iPad 2 '> no es una plataforma de implementación y esta acción no debería tener sido permitido ". Pero cuando abro XCode todo funciona bien
Ігар Цімошка
2
archiveLa acción siempre implica la firma y el destino debe establecerse en un dispositivo real. En su caso, el destino es iPad 2, lo que creo que es un simulador, por lo que no es posible archivar. Hay una opción importante que falta en su comando, es -sdk iphoneosprobar primero y ver cómo funciona. Cuando lo ejecuta desde Xcode IDE, probablemente tenga el destino configurado iOS Deviceo tal vez tenga un dispositivo real enchufado para que esté configurado como destino. Es por eso que el archivo funciona desde IDE. La línea de comando es más "tonta" y a veces puede usar opciones "incorrectas" de manera predeterminada, por lo que debe ser más específico.
i4niac
1
Esto debería ser votado más, ¡gracias! Los proyectos de Calabash con marcos Swift no se pueden compilar con XCode6.1.1 porque hay que compilarlos desde un esquema. Esta joya es asombrosa.
David
3

Una razón común para que falte el esquema es olvidarse de llevar los commits al origen. Si recibe un mensaje de esquema faltante, primero debe verificar que el esquema sea compartido, luego verificar que ha confirmado los cambios Y los ha enviado al servidor de origen.

Eric
fuente
1

Tuve este error al implementar CI. La pregunta anterior es idéntica a mis problemas, excepto que estoy usando la propia herramienta de CI de Gitlab. Puede verificar si hay algún archivo de este tipo en Bamboo.
Lo resolví haciendo algunos cambios en el gitlab-ci.ymlarchivo.
Después de que haya hecho su schemedisponibilidad compartiendo. En Xcode, vaya aProducts>Scheme>Manage Scheme y marque compartir para compartir.

Cambios

Establecer camino absoluto en todas partes.
p.ej. xcodebuild clean archive -archivePath /path/to/your/project/build/testDemo -scheme testDemo | xcpretty
aquí necesita cambiar /path/to/your/project/con su ruta y testDemocon el nombre de su proyecto.

Siddhartha S. Ikshavaku
fuente
0

Tengo el mismo problema pero durante la construcción con xcode como subproyecto del principal. Subproyecto integrado en xcode independiente: después de eso, este error desapareció.

htzfun
fuente
0

Me enfrenté a este problema e incluso si algunas de las respuestas aquí realmente proporcionan la solución, no lo encontré muy claro. Así que solo agregaré uno más. En pocas palabras, cómo compartir un esquema de excode.

Vaya a Product> Scheme>Manage Schemes

ingrese la descripción de la imagen aquí

Luego se le mostrará una lista de esquemas, cada uno de los cuales se indica como compartido o no. Solo marque las que desea compartir (pueden ser diferentes para las versiones de desarrollo y producción)

ingrese la descripción de la imagen aquí

Imágenes tomadas de este artículo https://developer.nevercode.io/docs/sharing-ios-project-schemes

Carlos Robles
fuente
0

Quiero agregar una solución para mi caso relacionado con este hilo. Este es para usted que clona proyectos existentes, con todos los esquemas que necesita ya se comparten:

ingrese la descripción de la imagen aquí

, con fastlane lanesmostrar correctamente todos sus carriles, incluidos todos sus esquemas:

ingrese la descripción de la imagen aquí

, pero fastlane gymsolo muestra los esquemas principales (no los esquemas de desarrollo y prueba):

ingrese la descripción de la imagen aquí

La solución es desmarcar la opción compartida para esquemas que no figuran en la lista fastlane gymy luego volver a marcarla . Generará .xcscheme para los esquemas:

ingrese la descripción de la imagen aquí

Ahora, si verifica con fastlane gym, se enumerarán todos los esquemas:

ingrese la descripción de la imagen aquí

Luego debe enviar esos archivos .xcshemes al repositorio, para que otros desarrolladores que clonen el proyecto obtengan los archivos.

Seto Elkahfi
fuente
0

Para cualquier persona con Xcode 11.4 que intente encontrar el botón "Compartido" en el esquema, ahora se ha movido al esquema individual.

  1. Seleccione el esquema que desee
  2. Presione "Editar"
  3. Marque la casilla "Compartido"

Edición de esquema contiene cuadro compartido ahora

green0range
fuente