[xcode] xcodebuild는 스키마가 포함되어 있지 않다고 말합니다.

골동품 문제가 있습니다.

내가 작업 해왔고 항상 XCode IDE에서 빌드 한 프로젝트가 있는데 잘 작동했습니다. 이제 프로젝트를 빌드하기 위해 Bamboo를 설정하고 있으므로 명령 줄에서 빌드하고 있습니다.

문제는 GIT에서 내 코드를 확인한 다음 xcodebuild를 사용하여 빌드하면 스키마를 찾을 수 없다는 메시지가 표시되지만 프로젝트를 열면 빌드되고 명령 줄에서 다시 빌드하려고하면 동일한 명령으로 작동합니다.

프로젝트를 열 때 XCode가 수행하는 마법은 무엇입니까? 아니면 .gitignore에서 파일을 제외하고 멍청한 일을하고 있습니까?



답변

.xcscheme 파일과 관련하여 확실히 올바른 길을 가고 있습니다. 내 프로젝트를 설정하는 동안이 문제가 나타났습니다!

후손이나 적어도 검색을 통해 여기로 오는 사람을 위해, 여기에 두 가지 버전이 있습니다. “나는 바빠서 사실 만 알려주세요”버전과 좀 더 관련된 토론과 근거입니다. 두 버전 모두 작업 공간 파일에서 빌드하려고한다고 가정합니다. 그렇지 않다면 대부분 작업 공간 기반 프로젝트에 적용되므로 사과드립니다.

요약 된 ‘Fix-it’버전

근본 원인은 Schemes의 기본 동작이 특별히 공유로 표시 될 때까지 스키마를 ‘비공개’로 유지하는 것입니다. 명령 줄에서 시작된 빌드의 경우 Xcode UI는 실행되지 않으며 xcoderun 도구에는 작업 할 자체 스키마 캐시가 없습니다. 목표는 Bamboo가 실행하기를 원하는 스킴을 생성, 공유 및 커밋하는 것입니다.

  1. 코드의 깨끗한 작업 복사본에서 프로젝트의 작업 영역을 엽니 다.
  2. 제품 메뉴에서 체계> 체계 관리 …를 선택합니다.
  3. 프로젝트에 대해 정의 된 구성표 목록이 나타납니다.
  4. Bamboo가 실행하려는 구성표를 찾습니다.
  5. 해당 구성표에 대해 ‘공유’상자가 선택되어 있고 ‘컨테이너’설정이 프로젝트 파일 자체가 아닌 작업 공간으로 설정되어 있는지 확인하십시오.
  6. ‘확인’을 클릭하여 구성표 관리 시트를 닫습니다.
  7. 새 .xcscheme 파일이 WorkspaceName.xcworkspace / xcshareddata / xcschemes의 프로젝트에 생성되었습니다.
  8. 이 파일을 저장소에 커밋하고 Bamboo 빌드를 실행합니다.

심층 토론 및 근거

Xcode 4는 관련 Xcode 프로젝트를 연결하고, 대상을 빌드하고, 구성을 함께 빌드하는 메커니즘을 처리하는 데 내재 된 혼란을 해결하는 데 도움이되는 방법으로 작업 공간 및 체계를 도입했습니다. 작업 공간 자체에는 포함 된 데이터의 작은 ‘상자’각각을 설명하는 자체 구성 데이터 세트가 있으며 .xcodeproj 파일을 첨부하기위한 스켈레톤과 각 개발자 시스템 또는 CI 시스템에 미러링되는 공유 구성 데이터 세트로 작동합니다. . 이것은 작업 공간의 힘이자 함정입니다 .1) 100 % 올바르게 구성했지만 잘못된 컨테이너에 넣거나 2) 올바른 컨테이너에 넣었지만 잘못 구성하여 데이터를 렌더링하는 방법이 많이 있습니다. 시스템의 다른 부분에서 액세스 할 수 없습니다!

Xcode 4 체계의 기본 동작은 프로젝트가 작업 공간 파일에 추가 될 때 새 체계를 자동으로 생성하는 것입니다. 여러 .xcodeproj 파일을 추가 한 사용자는 특히 프로젝트 파일이 추가 된 후 제거 된 다음 동일한 작업 공간으로 읽어 들일 때 구성표 목록이 빠르게 처리되지 않는 것을 알아 차렸을 것입니다. 자동 생성되거나 수동으로 생성 된 모든 체계는 기본적으로 .xcuserdata 파일이 프로젝트의 데이터 및 구성으로 커밋 된 경우에도 현재 사용자에게만 표시되는 ‘개인’체계입니다. 이것이 xcodebuild에서 Bamboo가보고하는 숨겨진 빌드 오류의 근본 원인입니다 .Bamboo는 Xcode UI가 아닌 명령 줄을 통해 빌드를 작동하기 때문에 Scheme이 자동으로 생성 될 기회가 없으며 해당 UI에만 의존합니다. 작업 공간 자체에서 정의됩니다.

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

xcodebuild는 < ‘workspace’Parameter Value> / xcshareddata / xcschemes에있는 < ‘scheme’Parameter Value> .xcscheme 파일을 찾습니다.

분명히 Bamboo와 작업 공간을 모두 구성 할 수있는 여러 가지 방법이 있으므로 고유 한 구성이 여기에 표시된 것과 100 % 매핑되지 않을 수 있습니다. 핵심 사항 :

  1. Xcode UI가 마술처럼 처리하는 특정 자동화 작업은 Xcodebuild CLI를 통해 사용할 수 없습니다.
  2. 스킴을 첨부하고 구성 데이터를 ‘컨테이너 계층 구조’의 여러 위치에 빌드 할 수 있습니다. 데이터가 올바른 컨테이너 (작업 공간, 프로젝트 및 / 또는 빌드 대상)에 있는지 확인합니다.
  3. 컨테이너 계층 구조에서 xcodebuild 도구가 구성 데이터를 찾을 수있는 위치를 고려하십시오. 검색이 시작되는 위치에 대한 훌륭한 지표는 ‘-workspace’또는 ‘-project’인수를 사용하는 것입니다.

‘공유 됨’상자는 이미 선택되어 있습니다. 이제 무엇을할까요?

내 Bamboo 인스턴스에서 이와 동일한 문제가 발생했습니다. 내 저장소에서 커밋 된 체계가 구식이고 최신 버전의 명령 줄 도구가 제대로 처리하지 않는 것으로 나타났습니다. 이것이 이전에 존재했기 때문에 구성표에 대해 눈에 띄는 사용자 정의가 없는지 설정을 살펴보고 구성표를 삭제하고 다시 생성하여 ‘공유 됨’으로 표시하고 새 .xcscheme 파일을 저장소.

모든 것이 좋아 보이고 다시 빌드해도 문제가 해결되지 않으면 컨테이너 설정을 다시 확인하십시오. 계층 구조의 잘못된 컨테이너에 해당 스키마를 연결하는 것은 정말 쉽습니다!


답변

다음과 같이 문제를 디버그하십시오.

xcodebuild -list

또는 작업 공간을 사용하는 경우 (예 : 포드 포함)

xcodebuild -workspace MyProject.xcworkspace -list

구성표가 나열되지 않으면 다음과 같이 수정하십시오.

여기에 이미지 설명 입력


답변

대부분의 답변은 Xcode를 사용하여 스키마를 공유 한 다음 repo에 변경 사항을 커밋하도록 제안합니다. 물론 작동하지만 소스 코드에 대한 액세스 권한이 있고 변경 사항을 커밋 할 수있는 권한이 있고 다른 몇 가지 가정이있는 경우에만 작동합니다.

하지만 고려해야 할 ” what ifs “가 많이 있습니다.

  • 어떤 이유로 Xcode 프로젝트를 수정할 수 없다면 어떨까요?
  • CI 서버에서 새 체계를 자동으로 생성하면 어떻게됩니까?
    이것은 실제로 꽤 자주 발생합니다. Calabash와 같은 테스트 자동화 프레임 워크를 사용하는 경우 일반적으로 기존 대상을 복제하여 자동으로 구성표도 복제하고 새 구성표는 원래 구성표가 공유 된 경우에도 공유되지 않습니다.

Ruby 및 xcodeproj gem

xcodeproj Ruby gem을 사용하는 것이 좋습니다 . 이것은 수많은 Xcode 관련 작업을 자동화하는 데 도움이되는 정말 멋진 오픈 소스 도구입니다.

Btw, 이것은 CocoaPods 에서 Xcode 프로젝트 및 작업 공간을 엉망으로 만드는 데 사용하는 보석 입니다.

그래서 그것을 설치하십시오

sudo gem install xcodeproj

그런 다음 간단한 Ruby 스크립트를 작성하여 모든 체계를 다시 공유하면 gem에는 해당 목적을위한 recreate_user_schemes 메소드가 있습니다.

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

사용자 폴더의 스키마 파일을 xcshareddata / xcschemes로 복사 할 뿐만 아니라 pbxproj 파일 을 구문 분석하여 해당 파일을 먼저 만듭니다 .


답변

좋아, 2 분 후에 알고 있지만 스키마를 공유로 설정해야한다는 또 다른 스택 오버플로를 발견했습니다. Xcode 4는 스키마 데이터를 어디에 저장합니까?


답변

계획이 누락되는 일반적인 이유 중 하나는 커밋을 오리진으로 푸시하는 것을 잊는 것입니다. 누락 된 체계 메시지가 표시되면 먼저 체계가 공유되었는지 확인한 다음 변경 사항을 커밋하고 원본 서버로 푸시했는지 확인해야합니다.


답변

CI를 구현하는 동안이 오류가 발생했습니다. 위의 질문은 Gitlab 자체 CI 도구를 사용하고 있다는 점을 제외하고는 내 문제와 동일합니다. Bamboo에 이러한 파일이 있는지 확인할 수 있습니다. 파일
을 약간 변경하여 해결했습니다 gitlab-ci.yml. 공유
하여 schemeavailabe를 만든 후 . Xcode에서 Products>Scheme>Manage Scheme공유 할 공유로 이동하여 확인하십시오.

변화

모든 곳에 절대 경로를 설정하십시오.
예. xcodebuild clean archive -archivePath /path/to/your/project/build/testDemo -scheme testDemo | xcpretty
여기에서 /path/to/your/project/경로와 testDemo프로젝트 이름 으로 변경해야합니다 .


답변

동일한 문제가 발생했지만 xcode를 기본 프로젝트의 하위 프로젝트로 빌드하는 동안. xcode 독립형으로 빌드 된 하위 프로젝트-그 후이 오류가 사라졌습니다.