Projeto Xcode vs. Área de trabalho do Xcode - Diferenças

402

Estou tentando entender como funciona todo o ecossistema iOS.
Até agora, eu conseguia encontrar uma resposta para a maioria das minhas perguntas (e confie em mim, existem muitas), mas, para essa, ainda não parece haver uma resposta clara.

Qual é a diferença entre os arquivos XcodeProject e XcodeWorkspace?

  1. Qual é a diferença entre os dois?
  2. Pelo que eles são responsáveis?
  3. Com qual deles devo trabalhar quando estiver desenvolvendo meus aplicativos em equipe / sozinho?
  4. Há mais alguma coisa que eu deva saber em relação a esses dois arquivos?
ms2
fonte

Respostas:

606

Eu acho que existem três itens principais que você precisa entender sobre a estrutura do projeto: Destinos , projetos e áreas de trabalho . Os destinos especificam em detalhes como um produto / binário (isto é, um aplicativo ou biblioteca) é construído. Eles incluem configurações de compilação, como sinalizadores de compilador e vinculador, e definem quais arquivos (código fonte e recursos) realmente pertencem a um produto. Ao criar / executar, você sempre seleciona um destino específico.

É provável que você tenha alguns destinos que compartilhem código e recursos. Esses diferentes destinos podem ser versões ligeiramente diferentes de um aplicativo (iPad / iPhone, marcas diferentes ...) ou casos de teste que naturalmente precisam acessar os mesmos arquivos de origem do aplicativo. Todos esses destinos relacionados podem ser agrupados em um projeto . Enquanto o projeto contém os arquivos de todos os seus destinos, cada destino escolhe seu próprio subconjunto de arquivos relevantes. O mesmo vale para as configurações de compilação: você pode definir configurações padrão para todo o projeto no projeto, mas se um de seus destinos precisar de configurações diferentes, sempre poderá substituí-las lá:

Configurações de projeto compartilhado que todos os destinos herdam, a menos que o substituam

Configurações de projeto compartilhado que todos os destinos herdam, a menos que o substituam

Configurações de destino concretas: o iPhone PSE substitui a configuração do SDK base do projeto

Configurações de destino concretas: o iPhone PSE substitui a Base SDKconfiguração do projeto

No Xcode, você sempre abre projetos (ou áreas de trabalho, mas não destinos), e todos os destinos que ele contém podem ser construídos / executados, mas não há como definir um projeto, portanto, todo projeto precisa de pelo menos um destino para ser mais do que apenas uma coleção de arquivos e configurações.

Selecione um dos destinos do projeto para executar

Selecione um dos destinos do projeto para executar

Em muitos casos, os projetos são tudo o que você precisa. Se você tiver uma dependência criada a partir da fonte, poderá incorporá-la como um subprojeto . Os subprojetos podem ser abertos separadamente ou dentro do super projeto.

demoLib é um subprojeto

demoLib é um subprojeto

Se você adicionar um dos destinos do subprojeto às dependências do super projeto, o subprojeto será construído automaticamente, a menos que permaneça inalterado. A vantagem aqui é que você pode editar arquivos do seu projeto e de suas dependências na mesma janela do Xcode e, ao criar / executar, você pode selecionar os destinos do projeto e de seus subprojetos:

Executando destinos de um subprojeto

Se, no entanto, sua biblioteca (o subprojeto) for usada por vários outros projetos (ou seus destinos, para ser mais preciso), faz sentido colocá-la no mesmo nível de hierarquia - é para isso que servem os espaços de trabalho . Os espaços de trabalho contêm e gerenciam projetos, e todos os projetos incluídos diretamente (ou seja, não seus subprojetos) estão no mesmo nível e seus destinos podem depender um do outro (os destinos dos projetos podem depender dos destinos dos subprojetos, mas não vice-versa).

Estrutura da área de trabalho

Estrutura da área de trabalho

Neste exemplo, os dois aplicativos ( AnotherApplication / ProjectStructureExample ) podem fazer referência aos destinos do projeto demoLib . Isso também seria possível incluindo o projeto demoLib nos dois outros projetos como um subprojeto (que é apenas uma referência, portanto não é necessária duplicação), mas se você tiver muitas dependências cruzadas, os espaços de trabalho farão mais sentido. Se você abrir um espaço de trabalho, poderá escolher entre os destinos de todos os projetos ao criar / executar.

Executando destinos de um espaço de trabalho

Você ainda pode abrir seus arquivos de projeto separadamente, mas é provável que seus destinos não sejam construídos porque o Xcode não pode resolver as dependências, a menos que você abra o arquivo da área de trabalho. As áreas de trabalho oferecem o mesmo benefício que os subprojetos: uma vez que uma dependência seja alterada, o Xcode o reconstruirá para garantir que esteja atualizado (embora eu tenha tido alguns problemas com isso, parece não funcionar de maneira confiável).

Suas perguntas em poucas palavras :

1) Os projetos contêm arquivos (código / recursos), configurações e destinos que constroem produtos a partir desses arquivos e configurações. As áreas de trabalho contêm projetos que podem se referir um ao outro.

2) Ambos são responsáveis ​​por estruturar todo o seu projeto, mas em diferentes níveis.

3) Eu acho que os projetos são suficientes na maioria dos casos. Não use áreas de trabalho, a menos que haja um motivo específico. Além disso, você sempre pode incorporar seu projeto em um espaço de trabalho posteriormente.

4) Acho que é para isso que serve o texto acima ...

Há uma observação para 3): o CocoaPods , que lida automaticamente com bibliotecas de terceiros para você, usa espaços de trabalho. Portanto, você também deve usá-los quando o usa CocoaPods(o que muitas pessoas fazem).

hagi
fonte
7
Um projeto pode fazer parte de dois espaços de trabalho separados? Ou, se eu quiser compartilhar um projeto com outros dois, eles precisariam fazer parte do mesmo espaço de trabalho?
Jack
8
Absolutamente, um projeto pode fazer parte de quantos espaços de trabalho você desejar. A adição de um projeto a um espaço de trabalho não altera nada sobre o próprio projeto. Então você tem muitas opções ... tudo em um espaço de trabalho, dois espaços de trabalho que compartilham um projeto ou dois projetos que têm o projeto compartilhado como um subprojeto.
hagi
11
Eu não tenho nenhuma experiência com isso, mas o README diz: " você mantém controle total sobre a estrutura e a configuração do seu projeto " e "em vez de integrar [dependências] em um único espaço de trabalho, [...] suas dependências devem incluir seu próprio projeto Xcode ". Resumindo: ele não toca em seus projetos / áreas de trabalho, então não vejo como devo incluí-lo na resposta. A resposta ainda é útil se você usar Cartago, principalmente porque você precisa decidir como estruturar suas dependências, mas nada disso é específico para Cartago.
hagi
Bem explicado sobre a hierarquia do projeto. Se eu remover / mover o subprojeto do local, o subprojeto permanecerá no projeto principal? stackoverflow.com/questions/40214505/…
Ganesh Guturi
O arquivo do projeto pai tem uma referência ao subprojeto, não uma cópia. Se o subprojeto for removido, o pai não o encontrará mais. Normalmente, você deseja garantir, no nível do sistema de arquivos, que o projeto pai tenha cópias locais de todos os seus subprojetos. Os gerenciadores de dependência, como CocoaPods ou Carthage, farão isso por você, ou você pode usar sub-módulos git.
hagi
103

Um espaço de trabalho é uma coleção de projetos. É útil organizar seus projetos quando houver correlação entre eles (por exemplo: o Projeto A inclui uma biblioteca, que é fornecida como um projeto em si como projeto B. Quando você cria a área de trabalho, o projeto B é compilado e vinculado no projeto A).
É comum usar um espaço de trabalho nos populares CocoaPods . Quando você instala seus pods, eles são colocados dentro de um espaço de trabalho que mantém seu projeto e as bibliotecas de pods.

andreamazz
fonte
35

Em resumo

  • O Xcode 3 introduziu o subprojeto, que é o relacionamento pai-filho, o que significa que o pai pode fazer referência ao seu destino filho, mas não vice-versa
  • O espaço de trabalho introduzido no Xcode 4, que é o relacionamento entre irmãos, significa que qualquer projeto pode fazer referência a projetos no mesmo espaço de trabalho
onmyway133
fonte
2

Quando usei o CocoaPods para desenvolver projetos iOS, existe um .xcworkspacearquivo, você precisa abrir o projeto com um .xcworkspacearquivo relacionado ao CocoaPods.

Visualização de arquivos

Mas quando você Show Package Contentscom .xcworkspacearquivo, você encontrará o contents.xcworkspacedataarquivo.

Conteúdo do pacote

<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "group:BluetoothColorLamp24G.xcodeproj">
   </FileRef>
   <FileRef
      location = "group:Pods/Pods.xcodeproj">
   </FileRef>
</Workspace>

preste atenção a esta linha:

location = "group:BluetoothColorLamp24G.xcodeproj"

O .xcworkspacearquivo tem referência com o .xcodeprojarquivo.

Ambiente de desenvolvimento:

macOS 10.14
Xcode 10.1
ifeegoo
fonte
2
  1. Qual é a diferença entre os dois?
    Área de trabalho é um conjunto de projetos

  2. Pelo que eles são responsáveis?
    O projeto é responsável pelo código fonte. O espaço de trabalho é responsável por dependências entre projetos

  3. Com qual deles devo trabalhar quando estiver desenvolvendo meus aplicativos em equipe / sozinho?
    Sua escolha deve depender de um tipo de seu projeto. Por exemplo, se o seu projeto depende do gerenciador de dependências do CocoaPods, ele cria um espaço de trabalho.

  4. Há mais alguma coisa que eu deva saber em relação a esses dois arquivos?
    Um concorrente do espaço de trabalho é cross-project references[Sobre]

[Componentes do Xcode]

yoAlex5
fonte