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


125

골동품 문제가 있습니다.

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

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

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


xcode에서 프로젝트를 열 때 .xcscheme 파일이 생성되지만 xcuserdata / username.xcuserdatad 폴더에 ...하지만 사용자 폴더 아래에 스키마가 '생성'되는 이유를 알 수 없습니다. 대나무에서 그것을 처리 할 것
자크 톨리

답변:


187

.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 파일을 저장소.

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


이것은 실제로 오류가 없지만 종료 코드 65를 반환하는 임의의 xcodebuild 오류를 수정했습니다. 컨테이너가 작업 공간 자체가 아닌 프로젝트로 설정되어 변경되고 짜잔 문제가 해결되었습니다. 감사.
사이먼 리

감사! 이것은 내가 찾던 바로 그 해결책입니다.
raidfive

내 테스트 및 아카이브 옵션이 비활성화되어 있기 때문입니다. 내 계획이 공유되어 있는지 확인했습니다. 여전히 봇을 통해 빌드 할 수 없습니다. 로컬에서 빌드 할 수 있지만 아카이브 할 수 없다고 언급했듯이. 당신은이 문제에 관한 생각합니까
로 Alix

감사! 스키마 컨테이너를 작업 공간으로 설정하면 TeamCity 빌드에서 발생하던 문제가 해결되었습니다.
양식

이 메시지에서 스키마를 찾는 방법. 정확히이 메시지가 표시됩니다. [xcodebuild : error : "jamesAppV2"라는 작업 공간에 ""라는 스키마가 없습니다. "-list"옵션을 사용하여 작업 공간에서 체계의 이름을 찾을 수 있습니다.]
Qadir Hussain

52

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

xcodebuild -list

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

xcodebuild -workspace MyProject.xcworkspace -list

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

여기에 이미지 설명 입력


계획을 공유하면 xcodebuild -list... 감사합니다!
Dan Rosenstark

35

대부분의 답변은 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 파일 을 구문 분석하여 해당 파일을 먼저 만듭니다 .


1
다른 사람이 이것을 우연히 발견하면 recreate_user_schemes테스트 대상을 올바르게 처리하지 못하는 것 같습니다 . 나는 그것에 대한 버그 보고서를 제출 했습니다 .
Matt Kantor 2014 년

나는 그것에 대해 블로그에 올렸다. nsbogan.com/xcode/2014/05/29/share-xcode-schemes . 불행히도 단위 테스트 문제는 아직 해결되지 않았습니다.
i4niac 2014

글쎄, 나는이 해결책을 시도했다. 하지만 실행할 때 xcodebuild -project Finance.xcodeproj -scheme "Finance" -configuration Release clean archive CODE_SIGN_IDENTITY="My Identity"'Scheme <IDEScheme : 0x7fc9ea5e5fd0 :'Finance '> 빌드 및 보관 요청을 받았지만 실행 대상 <IDERunDestination : 0x7fc9eb47c6c0 :'iPad 2 '>는 배포 플랫폼이 아니므로이 작업이 없어야합니다. 허용되었습니다 '. 하지만 개방 엑스 코드는 모두 잘 작동 할 때
Ігар Цімошка

2
archive작업에는 항상 서명이 포함되며 대상은 실제 장치로 설정되어야합니다. 귀하의 경우 목적지는 iPad 2시뮬레이터라고 생각하므로 보관이 불가능합니다. 명령에서 빠진 중요한 옵션이 하나 있습니다. -sdk iphoneos먼저 시도해보고 어떻게 진행되는지 확인하십시오. Xcode IDE에서 실행할 때 대상이로 설정되어 iOS Device있거나 실제 장치가 연결되어 대상으로 설정되어 있을 수 있습니다. 이것이 바로 아카이빙이 IDE에서 작동하는 이유입니다. 명령 줄은 더 "멍청한"것이므로 기본적으로 "잘못된"옵션을 사용할 수 있으므로 좀 더 구체적이어야합니다.
i4niac 2014

1
더 많이 찬성해야합니다-감사합니다! Swift 프레임 워크가있는 Calabash 프로젝트는 스키마에서 빌드해야하므로 XCode6.1.1로 빌드 할 수 없습니다. 이 보석은 굉장합니다.
David


3

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


1

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프로젝트 이름 으로 변경해야합니다 .


0

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


0

나는이 문제에 직면했고 여기에있는 답변 중 일부가 실제로 해결책을 제공하더라도 매우 명확하지 않았습니다. 그래서 하나 더 추가하겠습니다. 간단히 말해서 excode에서 스키마를 공유하는 방법입니다.

이동에 Product> Scheme>Manage Schemes

여기에 이미지 설명 입력

그러면 각각 공유 여부가 표시된 구성표 목록이 표시됩니다. 공유하려는 항목을 확인하기 만하면됩니다 (dev 및 prod 빌드의 경우 다를 수 있음).

여기에 이미지 설명 입력

이 기사에서 가져온 이미지 https://developer.nevercode.io/docs/sharing-ios-project-schemes


0

이 스레드와 관련된 내 사례에 대한 솔루션을 추가하고 싶습니다. 이것은 필요한 모든 체계가 이미 공유되고있는 기존 프로젝트를 복제하는 사용자를위한 것입니다.

여기에 이미지 설명 입력

, fastlane lanes모든 계획을 포함하여 모든 차선 을 올바르게 표시합니다.

여기에 이미지 설명 입력

, 그러나 fastlane gym기본 체계 만 표시합니다 (개발 및 테스트 체계가 아님) :

여기에 이미지 설명 입력

이 솔루션은하는 것입니다 계획에 대한 공유 옵션 선택을 취소 하여 나열되지 fastlane gym다음 다시 확인을 . 스키마에 대해 .xcscheme을 생성합니다.

여기에 이미지 설명 입력

이제로 확인하면 fastlane gym모든 구성표가 나열됩니다.

여기에 이미지 설명 입력

그런 다음 해당 .xcshemes 파일을 저장소에 커밋해야 프로젝트를 복제하는 다른 개발자가 파일을 얻을 수 있습니다.


0

Xcode 11.4를 사용하는 모든 사용자가 스키마에서 "공유"버튼을 찾으려고하면 이제 개별 스키마로 이동되었습니다.

  1. 원하는 구성표를 선택하십시오
  2. "편집"을 누르십시오.
  3. "공유"상자를 선택하십시오.

구성표 편집에 이제 공유 상자가 포함됨

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.