xcodebuild nói không chứa lược đồ


125

Tôi có một vấn đề tò mò.

Tôi có một dự án mà tôi đã làm việc và luôn được xây dựng từ XCode IDE và nó hoạt động tốt. Bây giờ tôi đang thiết lập Tre để xây dựng dự án và như vậy đang xây dựng nó từ dòng lệnh.

Vấn đề là, nếu tôi kiểm tra mã của mình ra khỏi GIT và sau đó sử dụng xcodebuild để xây dựng thì nó nói rằng lược đồ không thể tìm thấy, nhưng nếu tôi mở dự án, nó sẽ xây dựng và nếu sau đó tôi cố gắng xây dựng lại từ dòng lệnh với cùng một lệnh, nó hoạt động.

Phép thuật XCode đang làm gì khi tôi mở dự án hoặc tôi đang làm điều gì đó ngớ ngẩn, có thể loại trừ một tệp trong .gitignore mà tôi không nên?


Chỉ cần lưu ý rằng khi tôi mở dự án trong xcode là tạo tệp .xcscheme, nhưng trong thư mục xcuserdata / username.xcuserdatad ... nhưng tôi không hiểu tại sao lược đồ được 'tạo' bên dưới thư mục người dùng .. và tôi thế nào sẽ xử lý việc đó bằng tre
Zac Tolley

Câu trả lời:


186

Bạn chắc chắn đang đi đúng hướng đối với tệp .xcscheme - Tôi đã gặp sự cố này khi thiết lập các dự án của riêng mình!

Đối với hậu thế, hoặc ít nhất là bất cứ ai đến đây từ một tìm kiếm, đây là hai phiên bản của sự việc - phiên bản "Tôi đang bận, vì vậy chỉ là sự thật xin vui lòng" và một cuộc thảo luận và lý do liên quan nhiều hơn. Cả hai phiên bản này đều cho rằng bạn đang cố gắng xây dựng từ tệp Workspace; nếu bạn không xin lỗi thì điều này chủ yếu áp dụng cho các dự án dựa trên không gian làm việc.

Phiên bản 'Fix-it' cô đọng

Nguyên nhân sâu xa là hành vi mặc định của Scheme là giữ cho các lược đồ 'riêng tư' cho đến khi chúng được đánh dấu cụ thể là được chia sẻ. Trong trường hợp xây dựng dòng lệnh được khởi tạo, UI Xcode không bao giờ chạy và công cụ xcoderun không có bộ đệm Scheme riêng để làm việc. Mục tiêu là tạo, chia sẻ và cam kết chương trình bạn muốn Tre chạy:

  1. Trên một bản sao làm việc sạch của mã, hãy mở không gian làm việc của Dự án.
  2. Chọn lược đồ> Quản lý lược đồ ... từ Menu sản phẩm.
  3. Danh sách các Đề án được xác định cho dự án xuất hiện.
  4. Xác định vị trí Đề án Tre đang cố gắng chạy
  5. Đảm bảo hộp 'Chia sẻ' được chọn cho sơ đồ đó và cài đặt 'Container' được đặt thành Không gian làm việc chứ không phải chính tệp dự án.
  6. Nhấp vào 'OK' để loại bỏ bảng Quản lý lược đồ.
  7. Một tệp .xcscheme mới đã được tạo trong dự án của bạn tại WorkspaceName.xcworkspace / xc Shareddata / xcscheme.
  8. Cam kết tệp này vào kho lưu trữ của bạn và chạy bản dựng Tre.

Thảo luận sâu hơn và Cơ sở lý luận

Xcode 4 đã giới thiệu Không gian làm việc và Lược đồ như một cách giúp thử và chế ngự một số hỗn loạn vốn có để xử lý các cơ chế của các dự án Xcode liên quan đến dây, xây dựng mục tiêu và xây dựng cấu hình cùng nhau. Bản thân không gian làm việc có tập dữ liệu cấu hình riêng mô tả từng 'hộp' dữ liệu nhỏ hơn mà nó chứa và hoạt động như một bộ xương để đính kèm các tệp .xcodeproj và một tập hợp dữ liệu cấu hình được chia đôi cho mỗi máy phát triển hoặc hệ thống CI . Đây là cả sức mạnh và cạm bẫy của Không gian làm việc - có 1) rất nhiều cách để người ta có thể cấu hình chính xác 100%, nhưng đưa vào vùng chứa sai hoặc 2) đưa vào vùng chứa chính xác, nhưng được định cấu hình không chính xác do đó hiển thị dữ liệu không thể truy cập bởi các bộ phận khác của hệ thống!

Hành vi mặc định của các lược đồ Xcode 4 là tự động tạo các lược đồ mới khi các dự án được thêm vào tệp Workspace. Những người bạn đã thêm một số tệp .xcodeproj có thể nhận thấy rằng danh sách lược đồ của bạn nhanh chóng trở nên phi lý đặc biệt là khi các tệp dự án được thêm vào, sau đó được xóa và sau đó được gắn lại vào cùng một không gian làm việc. Tất cả các lược đồ, được tạo tự động hoặc được tạo thủ công, mặc định là các lược đồ 'riêng tư' chỉ hiển thị cho người dùng hiện tại ngay cả khi các tệp .xcuserdata được cam kết với dữ liệu và cấu hình của dự án. Đây là nguyên nhân sâu xa của lỗi xây dựng mật mã đó mà Tre báo cáo từ xcodebuild - Vì Tre vận hành việc xây dựng thông qua dòng lệnh chứ không phải UI Xcode, nên nó không có cơ hội để Scheme tự động tạo và chỉ dựa vào những thứ đó được định nghĩa trong chính không gian làm việc.

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

xcodebuild tìm kiếm tệp <'lược đồ' Giá trị tham số> .xcscheme hiện có tại <'không gian làm việc' Giá trị tham số> / xc Shareddata / xcscheme.

Rõ ràng có rất nhiều cách để người ta có thể định cấu hình cả Tre và không gian làm việc, vì vậy hãy nhớ rằng cấu hình duy nhất của bạn có thể không ánh xạ 100% với những gì được trình bày ở đây. Các bài học quan trọng:

  1. Một số tác vụ tự động nhất định mà Xcode UI chăm sóc một cách kỳ diệu không có sẵn thông qua Xcodebuild CLI.
  2. Bạn có thể đính kèm sơ đồ và xây dựng dữ liệu cấu hình cho nhiều nơi trong 'phân cấp vùng chứa' - Đảm bảo dữ liệu của bạn được cuộn vào đúng vùng chứa (Vùng làm việc, Dự án và / hoặc Mục tiêu xây dựng)
  3. Xem xét vị trí trong phân cấp vùng chứa, công cụ xcodebuild có thể đang tìm kiếm dữ liệu cấu hình; một chỉ báo tuyệt vời về nơi nó sẽ bắt đầu tìm kiếm dựa trên việc sử dụng các đối số '-workspace' hoặc '-project'.

Hộp 'Chia sẻ' đã được chọn ... bây giờ thì sao?

Tôi đã gặp vấn đề tương tự trên ví dụ Tre của riêng tôi; Hóa ra lược đồ đã cam kết trong kho lưu trữ của tôi đã lỗi thời và phiên bản mới nhất của các công cụ dòng lệnh không xử lý nó một cách duyên dáng. Vì điều này đã tồn tại trước đó, tôi đã xem qua các cài đặt để đảm bảo rằng không có bất kỳ tùy chỉnh nào về sơ đồ, đã xóa và tạo lại lược đồ đảm bảo rằng tôi đã đánh dấu nó là 'Được chia sẻ' và giới thiệu tệp .xcscheme mới cho kho.

Nếu mọi thứ đều ổn và xây dựng lại nó không giải quyết được vấn đề, hãy kiểm tra kỹ cài đặt vùng chứa đó - thực sự dễ dàng để có sơ đồ đó được gắn vào vùng chứa sai trong hệ thống phân cấp!


Điều này thực sự đã sửa một lỗi xcodebuild ngẫu nhiên cho tôi, nó không trả về lỗi nào ngoài mã thoát 65. Hóa ra container được đặt cho dự án chứ không phải chính không gian làm việc, đã thay đổi và voila, đã giải quyết được vấn đề. Cảm ơn.
Simon Lee

Cảm ơn! Đây chính xác là bản sửa lỗi mà tôi đang tìm kiếm.
raidfive

Tùy chọn lưu trữ và kiểm tra của tôi bị vô hiệu hóa là vì điều này. Tôi đã kiểm tra chương trình của tôi được chia sẻ. vẫn không thể xây dựng thông qua bot. Tôi có thể xây dựng cục bộ nhưng như tôi đã đề cập rằng tôi không thể lưu trữ nó. Bạn có nghĩ nó liên quan đến vấn đề này không
Alix

Cảm ơn! Đặt bộ chứa lược đồ vào không gian làm việc của tôi đã khắc phục các sự cố tôi gặp phải với các bản dựng TeamCity của tôi.
Mẫu

Làm thế nào để xác định vị trí lược đồ từ thông báo này. Tôi nhận được chính xác thông báo này. [Xcodebuild: error: Không gian làm việc có tên "jamesAppV2" không chứa lược đồ có tên "". Tùy chọn "-list" có thể được sử dụng để tìm tên của các lược đồ trong không gian làm việc.]
Qadir Hussain

52

Gỡ lỗi vấn đề như thế này:

xcodebuild -list

hoặc nếu bạn đang sử dụng một không gian làm việc (ví dụ với các nhóm)

xcodebuild -workspace MyProject.xcworkspace -list

Nếu chương trình của bạn không được liệt kê sửa chữa như vậy:

nhập mô tả hình ảnh ở đây


Làm cho các chương trình được chia sẻ cho phép họ hiển thị trong xcodebuild -list... cảm ơn!
Dan Rosenstark

35

Hầu hết các câu trả lời sẽ đề nghị bạn thực hiện chia sẻ lược đồ của mình bằng Xcode, sau đó cam kết thay đổi thành repo. Điều đó hoạt động, tất nhiên, nhưng chỉ khi bạn có quyền truy cập vào mã nguồn và có quyền cam kết thay đổi và một vài giả định khác.

Nhưng có một số " điều gì xảy ra nếu "

  • Điều gì xảy ra nếu bạn không thể sửa đổi dự án Xcode vì một số lý do?
  • Điều gì nếu bạn tạo một lược đồ mới tự động trên máy chủ CI?
    Điều này thực sự xảy ra khá thường xuyên. Nếu bạn sử dụng khung tự động hóa thử nghiệm, như Calabash, thông thường bạn sẽ sao chép một mục tiêu hiện có, nó cũng tự động sao chép một lược đồ và lược đồ mới không được chia sẻ, ngay cả khi lược đồ ban đầu là.

Đá quý Ruby & xcodeproj

Tôi khuyên bạn nên sử dụng đá quý xcodeproj Ruby. Đây là một công cụ mã nguồn mở thực sự tuyệt vời có thể giúp bạn tự động hóa hàng tấn các nhiệm vụ liên quan đến Xcode.

Btw, đây là viên ngọc được sử dụng bởi CocoaPods để gây rối với các dự án và không gian làm việc Xcode của bạn.

Vì vậy, cài đặt nó

sudo gem install xcodeproj

Sau đó viết một tập lệnh Ruby đơn giản để chia sẻ lại tất cả các lược đồ, đá quý có phương thức tái tạo_user_scheme cho mục đích đó

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

Nó không chỉ sao chép các tệp lược đồ từ thư mục của người dùng sang xc Shareddata / xcscheme , nó cũng tạo các tệp đó trước bằng cách phân tích tệp pbxproj .


1
Trong trường hợp bất kỳ ai khác vấp phải điều này, có vẻ như recreate_user_schemeskhông xử lý chính xác các mục tiêu thử nghiệm. Tôi đã nộp một báo cáo lỗi về nó .
Matt Kantor

Tôi viết blog về nó. nsbogan.com/xcode/2014/05/29/share-xcode-scheme . Thật không may, vấn đề với các bài kiểm tra đơn vị vẫn chưa được khắc phục.
i4niac

tốt, tôi đã thử giải pháp này Nhưng khi tôi chạy, xcodebuild -project Finance.xcodeproj -scheme "Finance" -configuration Release clean archive CODE_SIGN_IDENTITY="My Identity"tôi nhận được 'Scheme <IDEScheme: 0x7fc9ea5e5fd0:' Finance '> đã được yêu cầu xây dựng và lưu trữ, nhưng đích chạy <IDERunDestination: 0x7fc9eb47c6c0:' iPad 2 '> không phải là một nền tảng được cho phép '. Nhưng khi tôi tất cả XCode mở hoạt động tốt
Ігар Цімошка

2
archivehành động luôn liên quan đến việc ký và đích phải được đặt thành một thiết bị thực. Trong trường hợp đích của bạn là iPad 2, mà tôi nghĩ là giả lập, vì vậy không thể lưu trữ được. Có một tùy chọn quan trọng bị thiếu trong lệnh của bạn, đó là -sdk iphoneosThử trước và xem cách thực hiện. Khi bạn chạy nó từ Xcode IDE, bạn có thể đã đặt đích đến iOS Devicehoặc có thể bạn đã cắm thiết bị thật để nó được đặt làm đích. Đó là lý do tại sao lưu trữ hoạt động từ IDE. Dòng lệnh "câm" hơn và đôi khi có thể sử dụng các tùy chọn "sai" theo mặc định, do đó bạn cần phải cụ thể hơn.
i4niac

1
Điều này nên được nâng cao hơn - cảm ơn bạn! Các dự án Calabash với khung Swift không thể xây dựng với XCode6.1.1 vì bạn phải xây dựng chúng từ sơ đồ. Đá quý này là tuyệt vời.
David


3

Một lý do phổ biến cho chương trình bị thiếu là quên đẩy các cam kết về nguồn gốc. Nếu bạn nhận được một thông báo lược đồ bị thiếu, trước tiên bạn nên xác minh lược đồ được chia sẻ, sau đó xác minh rằng bạn đã thực hiện các thay đổi VÀ đẩy chúng đến máy chủ gốc.


1

Tôi đã gặp lỗi này khi triển khai CI. Câu hỏi trên giống hệt với các vấn đề của tôi ngoại trừ tôi đang sử dụng công cụ CI của Gitlab. Bạn có thể kiểm tra xem có bất kỳ tệp nào như vậy trong Tre không.
Tôi đã giải quyết nó bằng cách thực hiện một số thay đổi cho gitlab-ci.ymltập tin.
Sau khi bạn đã thực hiện schemeavailabe của bạn bằng cách chia sẻ. Trong Xcode Đi đến Products>Scheme>Manage Schemevà kiểm tra chia sẻ để chia sẻ.

Thay đổi

Đặt đường dẫn tuyệt đối ở mọi nơi.
ví dụ. xcodebuild clean archive -archivePath /path/to/your/project/build/testDemo -scheme testDemo | xcpretty
ở đây bạn cần thay đổi /path/to/your/project/với đường dẫn của bạn và testDemovới tên dự án của bạn.


0

Có cùng một vấn đề nhưng trong quá trình xây dựng với xcode là dự án con của chính. Dự án con được xây dựng trong độc lập xcode - sau đó lỗi này biến mất.


0

Tôi đã đối mặt với vấn đề này và ngay cả khi một số câu trả lời ở đây thực sự cung cấp giải pháp, tôi cũng không thấy nó rõ ràng. Vì vậy, tôi sẽ chỉ thêm một. Tóm lại, làm thế nào để chia sẻ một lược đồ từ đoạn trích.

Navigate to Product> Scheme>Manage Schemes

nhập mô tả hình ảnh ở đây

Sau đó, bạn sẽ được hiển thị một danh sách các lược đồ, với mỗi biểu thị là được chia sẻ hay không. Chỉ cần kiểm tra những cái bạn muốn chia sẻ (nó có thể là những cái khác nhau cho các bản dựng dev và prod)

nhập mô tả hình ảnh ở đây

Hình ảnh được lấy từ bài viết này https://developer.nevercode.io/docs/shared-ios-project-scheme


0

Tôi muốn thêm giải pháp cho trường hợp của tôi liên quan đến chủ đề này. Dự án này dành cho bạn, người đã sao chép dự án hiện có, với tất cả các chương trình bạn cần đã được chia sẻ:

nhập mô tả hình ảnh ở đây

, với fastlane laneshiển thị chính xác tất cả các làn của bạn, bao gồm tất cả các sơ đồ của bạn:

nhập mô tả hình ảnh ở đây

, nhưng fastlane gymchỉ hiển thị các lược đồ chính (không phải các sơ đồ dev và test):

nhập mô tả hình ảnh ở đây

Giải pháp là bỏ chọn tùy chọn chia sẻ cho các lược đồ không được liệt kê trước fastlane gymsau đó kiểm tra lại . Nó sẽ tạo .xcscheme cho các lược đồ:

nhập mô tả hình ảnh ở đây

Bây giờ, nếu bạn kiểm tra fastlane gym, tất cả các chương trình sẽ được liệt kê:

nhập mô tả hình ảnh ở đây

Sau đó, bạn nên cam kết các tệp .xcsheme đó vào kho lưu trữ, để nhà phát triển khác sao chép dự án sẽ nhận được các tệp.


0

Đối với bất kỳ ai có Xcode 11.4 đang cố gắng tìm nút "Được chia sẻ" trên lược đồ, giờ đây nó đã được chuyển sang sơ đồ riêng lẻ.

  1. Chọn chương trình bạn muốn
  2. Nhấn "Chỉnh sửa"
  3. Chọn hộp "Chia sẻ"

Lược đồ Chỉnh sửa Chứa hộp chia sẻ ngay bây giờ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.