Proyecto Xcode contra Xcode Workspace – Diferencias

Estoy tratando de entender cómo funciona todo el ecosistema de iOS .
Hasta ahora, podía encontrar una respuesta para la mayoría de mi pregunta (y créanme, ha habido muchas), pero para esta, parece que todavía no hay una respuesta clara.

¿Cuál es la diferencia entre los archivos XcodeProject y XcodeWorkspace?

  1. ¿Cuál es la diferencia entre los dos?
  2. ¿De qué son responsables?
  3. ¿Con cuál de ellos debería trabajar cuando estoy desarrollando mis aplicaciones en equipo / solo?
  4. ¿Hay algo más que deba conocer en relación con estos dos archivos?

Creo que hay tres elementos clave que debe comprender con respecto a la estructura del proyecto: objectives , proyectos y espacios de trabajo . Los objectives especifican en detalle cómo se genera un producto / binario (es decir, una aplicación o biblioteca). Incluyen configuraciones de comstackción, como indicadores de comstackdor y enlazador, y definen qué archivos (código fuente y recursos) pertenecen realmente a un producto. Cuando construye / ejecuta, siempre selecciona un objective específico.

Es probable que tenga algunos objectives que comparten código y recursos. Estos objectives diferentes pueden ser versiones ligeramente diferentes de una aplicación (iPad / iPhone, diferentes marcas, …) o casos de prueba que, naturalmente, necesitan acceder a los mismos archivos fuente que la aplicación. Todos estos objectives relacionados se pueden agrupar en un proyecto . Si bien el proyecto contiene los archivos de todos sus objectives, cada objective elige su propio subconjunto de archivos relevantes. Lo mismo ocurre con la configuración de comstackción: puede definir las configuraciones predeterminadas para todo el proyecto en el proyecto, pero si uno de sus objectives necesita configuraciones diferentes, siempre puede anularlas allí:

Configuración de proyectos compartidos que todos los destinos heredan, a menos que lo sobrescriban

Configuración de proyectos compartidos que todos los destinos heredan, a menos que lo anulen

Configuración concreta del objetivo: el iPhone PSE sobrescribe la configuración del SDK Base del proyecto

Configuración concreta del objective: el iPhone PSE anula la configuración del Base SDK del proyecto

En Xcode, siempre se abren proyectos (o espacios de trabajo, pero no objectives), y todos los objectives que contiene se pueden construir / ejecutar, pero no hay manera / definición de construir un proyecto, por lo que cada proyecto necesita al menos un objective para poder ser más que solo una colección de archivos y configuraciones.

Seleccione uno de los objetivos del proyecto para ejecutar

Seleccione uno de los objectives del proyecto para ejecutar

En muchos casos, los proyectos son todo lo que necesitas. Si tiene una dependencia que crea desde el origen, puede incrustarla como un subproyecto . Los subproyectos se pueden abrir por separado o dentro de su súper proyecto.

demoLib es un subproyecto

demoLib es un subproyecto

Si agrega uno de los objectives del subproyecto a las dependencias del superproyecto, el subproyecto se generará automáticamente a menos que no se haya modificado. La ventaja aquí es que puede editar archivos tanto de su proyecto como de sus dependencias en la misma ventana de Xcode, y cuando construye / ejecuta, puede seleccionar entre los objectives del proyecto y sus subproyectos:

Ejecución de objetivos desde un subproyecto

Sin embargo, si su biblioteca (el subproyecto) es utilizada por una variedad de otros proyectos (o sus objectives, para ser precisos), tiene sentido ponerlo en el mismo nivel de jerarquía, para eso están los espacios de trabajo . Los espacios de trabajo contienen y administran proyectos, y todos los proyectos que incluye directamente (es decir, no sus subproyectos) están en el mismo nivel y sus objectives pueden depender el uno del otro (los objectives de los proyectos pueden depender de los objectives de los subproyectos, pero no viceversa).

Estructura del espacio de trabajo

Estructura del espacio de trabajo

En este ejemplo, ambas aplicaciones ( AnotherApplication / ProjectStructureExample ) pueden hacer referencia a los objectives del proyecto demoLib . Esto también sería posible al incluir el proyecto demoLib en otros proyectos como un subproyecto (que es solo una referencia, por lo que no es necesaria una duplicación), pero si tiene muchas dependencias cruzadas, los espacios de trabajo tienen más sentido. Si abre un espacio de trabajo, puede elegir entre todos los objectives de los proyectos cuando se construye / ejecuta.

Ejecución de objetivos desde un espacio de trabajo

Aún puede abrir sus archivos de proyecto por separado, pero es probable que sus objectives no se compilen porque Xcode no puede resolver las dependencias a menos que abra el archivo de espacio de trabajo. Los espacios de trabajo le brindan el mismo beneficio que los subproyectos: una vez que cambia una dependencia, Xcode la reconstruirá para asegurarse de que esté actualizada (aunque he tenido algunos problemas con eso, parece que no funciona de manera confiable).

Tus preguntas en pocas palabras :

1) Los proyectos contienen archivos (código / recursos), configuraciones y objectives que crean productos a partir de esos archivos y configuraciones. Los espacios de trabajo contienen proyectos que pueden hacer referencia entre sí.

2) Ambos son responsables de estructurar su proyecto en general, pero en diferentes niveles.

3) Creo que los proyectos son suficientes en la mayoría de los casos. No use espacios de trabajo a menos que haya una razón específica. Además, siempre puede insertar su proyecto en un área de trabajo más adelante.

4) Creo que para eso es el texto de arriba …

Hay un comentario para 3): CocoaPods , que maneja automáticamente bibliotecas de terceros para ti, usa espacios de trabajo. Por lo tanto, también debe usarlos cuando usa CocoaPods (que mucha gente lo hace).

Un espacio de trabajo es una colección de proyectos. Es útil organizar sus proyectos cuando existe una correlación entre ellos (p. Ej .: el Proyecto A incluye una biblioteca, que se proporciona como un proyecto en sí mismo como proyecto B. Cuando construye el proyecto de área de trabajo B se comstack y vincula en el proyecto A).
Es común usar un espacio de trabajo en los populares CocoaPods . Cuando instala sus pods, se colocan dentro de un espacio de trabajo, que contiene su proyecto y las bibliotecas de pod.

En breve

  • Xcode 3 introdujo el subproyecto, que es una relación padre-hijo, lo que significa que el padre puede hacer referencia a su objective secundario, pero no viceversa
  • Xcode 4 introdujo el espacio de trabajo, que es una relación entre hermanos, lo que significa que cualquier proyecto puede hacer referencia a proyectos en el mismo espacio de trabajo