xcodebuild diz que não contém esquema

125

Eu tenho um problema curioso.

Eu tenho um projeto no qual trabalhei e sempre construí a partir do XCode IDE, e funcionou bem. Agora estou configurando o Bamboo para construir o projeto e, como tal, construindo-o a partir da linha de comando.

O problema é que, se eu retirar o código do GIT e usar o xcodebuild para construí-lo, ele diz que o esquema não pode ser encontrado, mas se eu abrir o projeto, ele cria e se eu tentar construí-lo novamente na linha de comando com o mesmo comando, funciona.

Que mágica o XCode está fazendo quando abro o projeto ou estou fazendo algo estúpido, talvez excluindo um arquivo no meu .gitignore que não deveria?

Zac Tolley
fonte
Acabei de notar que quando abro o projeto no xcode é criar um arquivo .xcscheme, mas na pasta xcuserdata / username.xcuserdatad ... mas não entendo por que o esquema é 'gerado' abaixo da pasta de usuários ... e como estou vai lidar com isso em bambu
Zac Tolley

Respostas:

186

Você está definitivamente no caminho certo em relação ao arquivo .xcscheme - eu tive esse problema aparecendo ao configurar meus próprios projetos!

Para a posteridade, ou pelo menos para qualquer um que chegar aqui a partir de uma pesquisa, aqui estão duas versões das coisas - a versão "Estou ocupado, portanto, apenas os fatos, por favor" e uma discussão e lógica mais envolvidas. Ambas as versões assumem que você está tentando criar a partir de um arquivo do Workspace; se você não estiver, desculpe-me, pois isso se aplica principalmente a projetos baseados no espaço de trabalho.

Versão condensada 'Fix-it'

A causa raiz é que o comportamento padrão dos Esquemas é manter os esquemas "privados" até que sejam marcados especificamente como compartilhados. No caso de uma construção iniciada pela linha de comando, a interface do usuário do Xcode nunca é executada e a ferramenta xcoderun não possui seu próprio cache de esquemas para trabalhar. O objetivo é gerar, compartilhar e confirmar o esquema que você deseja que o Bamboo execute:

  1. Em uma cópia de trabalho limpa do código, abra o espaço de trabalho do seu Projeto.
  2. Escolha Esquema> Gerenciar esquemas ... no menu Produto.
  3. A lista de esquemas definidos para o projeto é exibida.
  4. Localize o esquema que o Bamboo está tentando executar
  5. Verifique se a caixa 'Compartilhado' está marcada para esse esquema e se a configuração 'Contêiner' está definida como Área de trabalho e não o próprio arquivo do projeto.
  6. Clique em 'OK' para descartar a folha Gerenciar esquemas.
  7. Um novo arquivo .xcscheme foi criado no seu projeto em WorkspaceName.xcworkspace / xcshareddata / xcschemes.
  8. Confirme esse arquivo no seu repositório e execute uma compilação Bamboo.

Discussão e justificativa mais profundas

O Xcode 4 introduziu os Espaços de trabalho e os esquemas como uma maneira de ajudar a domesticar parte do caos inerente a lidar com a mecânica da fiação de projetos relacionados ao Xcode, construir alvos e criar configurações juntos. O próprio espaço de trabalho possui seu próprio conjunto de dados de configuração que descreve cada uma das 'caixas' menores de dados que ele contém e atua como um esqueleto para anexar arquivos .xcodeproj e um conjunto de dados de configuração compartilhados que são espelhados para cada máquina de desenvolvedor ou sistema de IC . Esse é o poder e a armadilha dos Espaços de Trabalho - existem 1) várias maneiras pelas quais alguém pode configurar 100% corretamente, mas colocar no contêiner errado ou 2) colocar no contêiner correto, mas configurado incorretamente, renderizando dados inacessível por outras partes do sistema!

O comportamento padrão dos esquemas do Xcode 4 é gerar automaticamente novos esquemas à medida que os projetos são adicionados ao arquivo do Espaço de Trabalho. Aqueles de vocês que adicionaram vários arquivos .xcodeproj podem ter notado que sua lista de esquemas se torna rapidamente irregular, especialmente quando os arquivos do projeto são adicionados, removidos e depois lidos para o mesmo espaço de trabalho. Todos os esquemas, gerados automaticamente ou criados manualmente, passam a ser esquemas 'particulares' visíveis apenas para o usuário atual, mesmo quando os arquivos .xcuserdata são confirmados com os dados e a configuração do projeto. Essa é a causa raiz desse erro de construção enigmático que o Bamboo relata do xcodebuild - Como o Bamboo opera a construção por meio da linha de comando e não da interface do usuário do Xcode, ele não tem a oportunidade de os esquemas serem gerados automaticamente e depende apenas daqueles que são definidos no próprio espaço de trabalho.

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

O xcodebuild procura o arquivo <'esquema' Valor do parâmetro> .xcscheme existente no <'espaço de trabalho' Valor do parâmetro> / xcshareddata / xcschemes.

Obviamente, existem várias maneiras pelas quais alguém pode configurar o Bamboo e um espaço de trabalho, portanto, lembre-se de que sua configuração exclusiva pode não mapear 100% para o que é apresentado aqui. Os principais tópicos:

  1. Certas tarefas automatizadas pelas quais a interface do usuário do Xcode cuida magicamente não estão disponíveis na CLI do Xcodebuild.
  2. Você pode anexar esquemas e criar dados de configuração a vários locais da 'hierarquia de contêineres' - verifique se os dados acabam no contêiner certo (espaço de trabalho, projeto e / ou destino de compilação)
  3. Considere onde na hierarquia de contêineres a ferramenta xcodebuild pode estar procurando dados de configuração; um ótimo indicador de onde ele começará a procurar é baseado no uso dos argumentos '-workspace' ou '-project'.

A caixa 'Compartilhada' já está marcada ... e agora?

Encontrei esse mesmo problema em minha própria instância do Bamboo; descobriu-se que o esquema confirmado no meu repositório estava desatualizado e a versão mais recente das ferramentas de linha de comando não estava lidando com isso normalmente. Como isso existia anteriormente, dei uma olhada nas configurações para garantir que não houvesse algo flagrantemente personalizado sobre o esquema, excluí e recriei o esquema, garantindo que eu o marquei como 'Compartilhado' e recomendo o novo arquivo .xcscheme para o repositório.

Se tudo parecer bom e a reconstrução não resolver o problema, verifique novamente a configuração do contêiner - é realmente fácil anexar esse esquema ao contêiner errado na hierarquia!

Bryan Musial
fonte
Na verdade, isso corrigiu um erro aleatório do xcodebuild para mim, que estava retornando erros de NO, mas um código de saída 65. Acontece que o contêiner foi definido para o projeto e não para o próprio espaço de trabalho, mudou e pronto, problema resolvido. Obrigado.
Simon Lee
Obrigado! Esta é exatamente a correção que eu estava procurando.
27414 raidfive
A minha opção de teste e arquivamento está desativada é por causa disso. Eu verifiquei que meu esquema é compartilhado. Ainda não é possível construir através do bot. Eu sou capaz de construir localmente, mas como mencionei que não posso arquivá-lo. Você acha que isso está relacionado a este problema
Alix
Obrigado! Definir o contêiner do esquema para minha área de trabalho corrigiu os problemas que eu estava tendo com minhas compilações do TeamCity.
Formulário
como localizar o esquema desta mensagem. Estou recebendo exatamente essa mensagem. [Xcodebuild: error: O espaço de trabalho chamado "jamesAppV2" não contém um esquema chamado "". A opção "-list" pode ser usado para encontrar os nomes dos esquemas no espaço de trabalho].
Qadir Hussain
52

Depure o problema assim:

xcodebuild -list

ou se você estiver usando uma área de trabalho (por exemplo, com pods)

xcodebuild -workspace MyProject.xcworkspace -list

Se o seu esquema não estiver listado, corrija da seguinte maneira:

insira a descrição da imagem aqui

Robert
fonte
Compartilhar os esquemas permite que eles apareçam em xcodebuild -list... obrigado!
Dan Rosenstark
35

A maioria das respostas sugere que você compartilhe seu esquema usando o Xcode e confirme as alterações no repo. Isso funciona, é claro, mas apenas se você tiver acesso ao código-fonte e tiver direitos para confirmar alterações, além de outras suposições.

Mas há uma série de " e se " a considerar

  • E se você simplesmente não puder modificar o projeto Xcode por algum motivo?
  • E se você criar um novo esquema automaticamente no servidor de IC?
    Isso realmente acontece com bastante frequência. Se você usar a estrutura de automação de teste, como o Calabash, você normalmente duplicará um destino existente, que também duplica automaticamente um esquema, e o novo esquema não será compartilhado, mesmo que o esquema original fosse.

Ruby & xcodeproj gem

Eu recomendaria o uso do xcodeproj Ruby gem. Esta é uma ferramenta de código aberto realmente interessante que pode ajudá-lo a automatizar várias tarefas relacionadas ao Xcode.

Aliás, essa é a gema usada pelos CocoaPods para mexer com seus projetos e espaços de trabalho do Xcode.

Então instale

sudo gem install xcodeproj

Em seguida, escreva um script Ruby simples para compartilhar novamente todos os esquemas; a gema tem o método recreate_user_schemes para esse fim

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

Ele não copia apenas os arquivos de esquema da pasta do usuário para xcshareddata / xcschemes , mas também cria esses arquivos primeiro analisando o arquivo pbxproj .

i4niac
fonte
1
Caso alguém tropeçar nisso, parece que recreate_user_schemesnão lida com os objetivos de teste corretamente. Arquivei um relatório de bug sobre isso .
precisa
Eu escrevi sobre isso. nsbogan.com/xcode/2014/05/29/share-xcode-schemes . Infelizmente, o problema com os testes de unidade ainda não foi corrigido.
I4niac
bem, eu tentei esta solução. Mas quando executo xcodebuild -project Finance.xcodeproj -scheme "Finance" -configuration Release clean archive CODE_SIGN_IDENTITY="My Identity", recebi 'Scheme <IDEScheme: 0x7fc9ea5e5fd0:' Finance '> foi solicitado a criar e arquivar, mas o destino de execução <IDERunDestination: 0x7fc9eb47c6c0:' iPad 2 '> não é uma plataforma de implantação e esta ação não deve ter permitido ". Mas quando eu XCode aberto todo funciona bem
Ігар Цімошка
2
archiveA ação sempre envolve assinatura e o destino deve ser definido como um dispositivo real. No seu caso, o destino é iPad 2, o que eu acho, é um simulador, então não é possível arquivar. Falta uma opção importante no seu comando, é -sdk iphoneosExperimente primeiro e veja como vai. Ao executá-lo no Xcode IDE, você provavelmente tem o destino definido iOS Deviceou talvez tenha um dispositivo real conectado, de modo que esteja definido como destino. É por isso que o arquivamento funciona a partir do IDE. A linha de comando é mais "burra" e às vezes pode usar opções "erradas" por padrão, portanto, você precisa ser mais específico.
I4niac
1
Isso deve ser mais votado - obrigado! Projetos de cabaça com estruturas Swift falham ao compilar com o XCode6.1.1 porque você precisa construí-los a partir de um esquema. Esta jóia é incrível.
David
9

Ok, eu sei que são 2 minutos depois, mas encontrei outro estouro de pilha que diz que o esquema deve ser definido como compartilhado ... Onde o Xcode 4 armazena os dados do esquema?

Zac Tolley
fonte
3

Um motivo comum para a falta do esquema é esquecer de enviar os commit à origem. Se você receber uma mensagem de esquema ausente, verifique primeiro se o esquema foi compartilhado e verifique se as alterações foram confirmadas E as empurrou para o servidor de origem.

Eric
fonte
1

Eu tive esse erro ao implementar o IC. A pergunta acima é idêntica aos meus problemas, exceto pelo uso da ferramenta de CI do Gitlab. Você pode verificar se existe algum arquivo no Bamboo.
Eu o resolvi fazendo algumas alterações no gitlab-ci.ymlarquivo.
Depois que você tiver schemedisponibilizado compartilhando. No Xcode, vá para Products>Scheme>Manage Schemee marque compartilhar para compartilhar.

Alterar

Definir caminho absoluto em todos os lugares.
por exemplo. xcodebuild clean archive -archivePath /path/to/your/project/build/testDemo -scheme testDemo | xcpretty
aqui você precisa mudar /path/to/your/project/com o seu caminho e testDemocom o nome do seu projeto.

Siddhartha S. Ikshavaku
fonte
0

Tenho o mesmo problema, mas durante a construção com o xcode como subprojeto do principal. Subprojeto incorporado no xcode autônomo - depois disso esse erro desapareceu.

htzfun
fonte
0

Eu enfrentei esse problema e, mesmo que algumas das respostas aqui realmente forneçam a solução, não achei muito claro. Então, vou adicionar mais um. Em poucas palavras, como compartilhar um esquema do excode.

Navegue até Product> Scheme>Manage Schemes

insira a descrição da imagem aqui

Você verá uma lista de esquemas, com cada um deles indicado como sendo compartilhado ou não. Basta verificar as que você deseja compartilhar (podem ser diferentes para compilações de desenvolvedores e desenvolvedores)

insira a descrição da imagem aqui

Imagens tiradas deste artigo https://developer.nevercode.io/docs/sharing-ios-project-schemes

Carlos Robles
fonte
0

Quero adicionar uma solução para o meu caso relacionada a este segmento. Este é para você que clona o projeto existente, com todos os esquemas que você precisa já estão sendo compartilhados:

insira a descrição da imagem aqui

, com fastlane lanesexibir corretamente todas as suas faixas, incluindo todos os seus esquemas:

insira a descrição da imagem aqui

, mas fastlane gymmostra apenas os principais esquemas (não os dev e esquemas de teste):

insira a descrição da imagem aqui

A solução é desmarcar a opção compartilhada para esquemas não listados por fastlane gyme, em seguida, verificar novamente . Ele irá gerar .xcscheme para os esquemas:

insira a descrição da imagem aqui

Agora, se você marcar com fastlane gym, todos os esquemas serão listados:

insira a descrição da imagem aqui

Em seguida, você deve confirmar o arquivo .xcshemes no repositório, para que outro desenvolvedor que clone o projeto obtenha os arquivos.

Seto Elkahfi
fonte
0

Para qualquer um com o Xcode 11.4 tentando encontrar o botão "Compartilhado" no esquema, ele agora é movido para o esquema individual.

  1. Selecione o esquema que você deseja
  2. Pressione "Editar"
  3. Marque a caixa "Compartilhado"

A edição do esquema contém a caixa compartilhada agora

green0range
fonte