xcodebuild mengatakan tidak mengandung skema

125

Saya memiliki masalah keingintahuan.

Saya memiliki proyek yang telah saya kerjakan dan selalu dibangun dari XCode IDE, dan itu bekerja dengan baik. Sekarang saya menyiapkan Bamboo untuk membangun proyek dan dengan demikian saya membangunnya dari baris perintah.

Masalahnya adalah, jika saya memeriksa kode saya dari GIT dan kemudian menggunakan xcodebuild untuk membangunnya, dikatakan bahwa skema tidak dapat ditemukan, tetapi jika saya membuka proyek, itu membangun dan jika saya kemudian mencoba membangunnya lagi dari baris perintah dengan perintah yang sama, itu berhasil.

Keajaiban apa yang dilakukan XCode ketika saya membuka proyek atau apakah saya melakukan sesuatu yang bodoh, mungkin mengecualikan file di .gitignore yang seharusnya tidak saya lakukan?

Zac Tolley
sumber
Baru perhatikan bahwa ketika saya membuka proyek di xcode adalah membuat file .xcscheme, tetapi di folder xcuserdata / username.xcuserdatad ... tapi saya tidak mengerti mengapa skema 'dihasilkan' di bawah folder pengguna .. dan bagaimana saya akan menanganinya di bambu
Zac Tolley

Jawaban:

187

Anda pasti berada di jalur yang benar sehubungan dengan file .xcscheme - Saya mengalami masalah ini muncul saat menyiapkan proyek saya sendiri!

Untuk anak cucu, atau setidaknya siapa pun yang sampai di sini dari pencarian, berikut adalah dua versi dari hal-hal - versi "Saya sibuk, jadi tolong fakta-fakta saja" dan diskusi dan alasan yang lebih terlibat. Kedua versi ini menganggap Anda mencoba membangun dari file Workspace; jika Anda tidak maka saya mohon maaf karena ini sebagian besar berlaku untuk proyek berbasis ruang kerja.

Versi 'Fix-it' yang kental

Akar penyebabnya adalah bahwa perilaku default Skema adalah menjaga skema 'pribadi' hingga secara khusus ditandai sebagai dibagikan. Dalam kasus build yang dimulai dengan command line, Xcode UI tidak pernah berjalan dan alat xcoderun tidak memiliki cache Skema sendiri untuk digunakan. Tujuannya adalah untuk menghasilkan, membagikan, dan menjalankan skema yang Anda inginkan untuk dijalankan oleh Bamboo:

  1. Pada salinan kerja kode yang bersih, buka ruang kerja Proyek Anda.
  2. Pilih Skema> Kelola Skema ... dari Menu Produk.
  3. Daftar Skema yang ditentukan untuk proyek muncul.
  4. Temukan Skema yang coba dijalankan Bambu
  5. Pastikan kotak 'Shared' dicentang untuk skema itu dan pengaturan 'Container' disetel ke Workspace dan bukan file proyek itu sendiri.
  6. Klik 'OK' untuk menutup lembar Kelola Skema.
  7. File .xcscheme baru telah dibuat dalam proyek Anda di WorkspaceName.xcworkspace / xcshareddata / xcschemes.
  8. Komit file ini ke repositori Anda dan jalankan versi Bamboo.

Diskusi dan Dasar Pemikiran yang Lebih Dalam

Xcode 4 memperkenalkan Ruang Kerja dan Skema sebagai cara untuk membantu mencoba dan menjinakkan beberapa kekacauan yang melekat dalam menangani mekanisme proyek Xcode terkait kabel, membangun target, dan membangun konfigurasi bersama-sama. Ruang kerja itu sendiri memiliki kumpulan data konfigurasinya sendiri yang mendeskripsikan setiap 'kotak' kecil dari data yang dikandungnya dan bertindak sebagai kerangka untuk melampirkan file .xcodeproj dan sekumpulan data konfigurasi bersama yang dicerminkan ke setiap mesin pengembang atau sistem CI . Ini adalah kekuatan dan kelemahan Workspaces - ada 1) banyak cara di mana seseorang dapat mengkonfigurasi 100% dengan benar, tetapi dimasukkan ke dalam penampung yang salah atau 2) dimasukkan ke dalam penampung yang benar, tetapi dikonfigurasi dengan tidak tepat sehingga merender data tidak dapat diakses oleh bagian lain dari sistem!

Perilaku default skema Xcode 4 adalah secara otomatis menghasilkan skema baru saat proyek ditambahkan ke file Workspace. Anda yang telah menambahkan beberapa file .xcodeproj mungkin telah memperhatikan bahwa daftar skema Anda dengan cepat menjadi sulit diatur terutama saat file proyek ditambahkan, kemudian dihapus, dan kemudian dibaca kembali ke ruang kerja yang sama. Semua skema, dibuat secara otomatis atau dibuat secara manual, defaultnya adalah skema 'pribadi' yang hanya terlihat oleh pengguna saat ini bahkan ketika file .xcuserdata dijalankan dengan data dan konfigurasi proyek. Ini adalah akar penyebab dari kesalahan build samar Laporan Bamboo dari xcodebuild - Karena Bamboo mengoperasikan build melalui baris perintah dan bukan UI Xcode, ini tidak memiliki kesempatan untuk Skema untuk dibuat secara otomatis dan hanya bergantung pada yang ditentukan di ruang kerja itu sendiri.

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

xcodebuild pergi mencari file <'scheme' Parameter Value> .xcscheme yang ada di <'workspace' Parameter Value> / xcshareddata / xcschemes.

Jelas ada banyak cara di mana seseorang dapat mengonfigurasi Bamboo dan ruang kerja, jadi perlu diingat bahwa konfigurasi unik Anda mungkin tidak memetakan 100% ke apa yang disajikan di sini. Poin utama:

  1. Tugas otomatis tertentu yang ditangani secara ajaib oleh Xcode UI tidak tersedia melalui CLI Xcodebuild.
  2. Anda dapat melampirkan skema dan membangun data konfigurasi ke banyak tempat di 'hierarki penampung' - Pastikan data Anda berakhir di penampung yang tepat (Ruang Kerja, Proyek, dan / atau Bangun Target)
  3. Pertimbangkan di bagian mana dalam hierarki container alat xcodebuild mungkin mencari data konfigurasi; indikator yang bagus tentang di mana ia akan mulai mencari didasarkan pada penggunaan argumen '-workspace' atau '-project'.

Kotak 'Bersama' sudah dicentang ... sekarang apa?

Saya mengalami masalah yang sama di instance Bamboo saya sendiri; ternyata skema yang dilakukan di repositori saya sudah usang dan versi terbaru dari alat baris perintah tidak menanganinya dengan baik. Karena ini ada sebelumnya, saya melihat melalui pengaturan untuk memastikan tidak ada sesuatu yang sangat khusus tentang skema, menghapus dan membuat ulang skema memastikan bahwa saya menandainya sebagai 'Dibagikan', dan memasukkan kembali file .xcscheme baru ke gudang.

Jika semuanya terlihat baik dan membangunnya kembali tidak menyelesaikan masalah, periksa kembali pengaturan kontainer - sangat mudah untuk memasang skema itu ke kontainer yang salah dalam hierarki!

Bryan Musial
sumber
Ini benar-benar memperbaiki kesalahan xcodebuild acak untuk saya yang mengembalikan kesalahan NO tetapi kode keluar 65. Ternyata wadah itu disetel ke proyek dan bukan ruang kerja itu sendiri, mengubahnya dan voila, masalah terpecahkan. Terima kasih.
Simon Lee
Terima kasih! Inilah perbaikan yang saya cari.
raidfive
Tes SAYA dan opsi arsip dinonaktifkan karena ini. Saya telah memeriksa skema saya dibagikan. masih tidak dapat membangun melalui bot. Saya dapat membangun secara lokal tetapi seperti yang saya sebutkan bahwa saya tidak dapat mengarsipkannya. Apakah menurut Anda ini terkait dengan masalah ini
Alix
Terima kasih! Menetapkan wadah skema ke ruang kerja saya memperbaiki masalah yang saya alami dengan build TeamCity saya.
Formulir
bagaimana menemukan skema dari pesan ini. Saya mendapatkan pesan ini persis seperti ini. [Xcodebuild: error: Ruang kerja bernama "jamesAppV2" tidak berisi skema bernama "". Opsi "-list" dapat digunakan untuk menemukan nama skema di ruang kerja.]
Qadir Hussain
52

Debug masalah seperti ini:

xcodebuild -list

atau jika Anda menggunakan ruang kerja (mis. dengan pod)

xcodebuild -workspace MyProject.xcworkspace -list

Jika skema Anda tidak terdaftar perbaiki seperti ini:

masukkan deskripsi gambar di sini

Robert
sumber
Membuat skema dibagikan memungkinkan mereka muncul di xcodebuild -list... terima kasih!
Dan Rosenstark
35

Sebagian besar jawaban menyarankan Anda untuk membuat skema Anda dibagikan menggunakan Xcode, lalu lakukan perubahan pada repo. Itu berfungsi, tentu saja, tetapi hanya jika Anda memiliki akses ke kode sumber dan memiliki hak untuk melakukan perubahan, dan beberapa asumsi lainnya.

Tapi ada sejumlah " bagaimana jika " yang perlu dipertimbangkan

  • Bagaimana jika Anda tidak dapat memodifikasi proyek Xcode karena alasan tertentu?
  • Bagaimana jika Anda membuat skema baru secara otomatis di CI server?
    Ini sebenarnya cukup sering terjadi. Jika Anda menggunakan kerangka kerja otomatisasi pengujian, seperti Calabash, Anda biasanya akan menduplikasi target yang ada, yang secara otomatis menduplikasi skema juga, dan skema baru tidak dibagikan, meskipun skema aslinya digunakan.

Permata Ruby & xcodeproj

Saya akan merekomendasikan menggunakan permata xcodeproj Ruby. Ini adalah alat open source yang sangat keren yang dapat membantu Anda mengotomatiskan banyak tugas terkait Xcode.

Btw, ini adalah permata yang digunakan oleh CocoaPods untuk mengotak - atik proyek dan ruang kerja Xcode Anda.

Jadi instal

sudo gem install xcodeproj

Kemudian tulis skrip Ruby sederhana untuk membagikan kembali semua skema, permata tersebut memiliki metode reinate_user_schemes untuk tujuan itu

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

Itu tidak hanya menyalin file skema dari folder pengguna ke xcshareddata / xcschemes , tetapi juga membuat file-file itu terlebih dahulu dengan mengurai file pbxproj .

i4niac
sumber
1
Jika ada orang lain yang tersandung pada ini, tampaknya itu recreate_user_schemestidak menangani target pengujian dengan benar. Saya telah mengajukan laporan bug tentang itu .
Matt Kantor
Saya menulis blog tentang itu. nsbogan.com/xcode/2014/05/29/share-xcode-schemes . Sayangnya masalah dengan unit test masih belum diperbaiki.
i4niac
baik, saya mencoba solusi ini. Tetapi ketika saya menjalankan, xcodebuild -project Finance.xcodeproj -scheme "Finance" -configuration Release clean archive CODE_SIGN_IDENTITY="My Identity"saya mendapat 'Scheme <IDEScheme: 0x7fc9ea5e5fd0:' Finance '> diminta untuk membuat dan mengarsipkan, tetapi tujuan yang dijalankan <IDERunDestination: 0x7fc9eb47c6c0:' iPad 2 '> bukanlah platform penerapan dan tindakan ini seharusnya tidak telah diizinkan '. Tetapi ketika saya membuka XCode semuanya berfungsi dengan baik
Ігар Цімошка
2
archivetindakan selalu melibatkan penandatanganan dan tujuan harus diatur ke perangkat nyata. Dalam kasus Anda, tujuannya adalah iPad 2, yang menurut saya simulator, jadi tidak ada pengarsipan yang memungkinkan. Ada satu opsi penting yang hilang dari perintah Anda, itu -sdk iphoneoscoba dulu dan lihat bagaimana kelanjutannya. Saat Anda menjalankannya dari Xcode IDE, Anda mungkin memiliki tujuan yang ditetapkan iOS Deviceatau mungkin Anda memiliki perangkat asli yang dicolokkan sehingga ditetapkan sebagai tujuan. Itulah mengapa pengarsipan bekerja dari IDE. Baris perintah lebih "bodoh" dan terkadang dapat menggunakan opsi "salah" secara default sehingga Anda harus lebih spesifik.
i4niac
1
Ini harus lebih banyak disukai - terima kasih! Proyek Calabash dengan kerangka kerja Swift gagal dibangun dengan XCode6.1.1 karena Anda harus membangunnya dari skema. Permata ini luar biasa.
David
9

Ok saya tahu 2 menit kemudian tetapi saya menemukan stack overflow lain yang mengatakan skema harus diatur untuk dibagikan ... Di mana Xcode 4 menyimpan Data Skema?

Zac Tolley
sumber
3

Salah satu alasan umum hilangnya skema adalah lupa untuk mendorong komitmen ke asalnya. Jika Anda mendapatkan pesan skema yang hilang, Anda harus terlebih dahulu memverifikasi bahwa skema tersebut dibagikan, lalu verifikasi bahwa Anda telah melakukan perubahan DAN mendorongnya ke server asal.

Eric
sumber
1

Saya mengalami kesalahan ini saat mengimplementasikan CI. Pertanyaan di atas identik dengan masalah saya kecuali saya menggunakan alat CI Gitlab sendiri. Anda dapat memeriksa apakah ada file seperti itu di Bamboo.
Saya menyelesaikannya dengan membuat beberapa perubahan pada gitlab-ci.ymlfile.
Setelah Anda membuat schemeketersediaan dengan berbagi. Di Xcode Buka Products>Scheme>Manage Schemedan centang bagikan untuk dibagikan.

Perubahan

Tetapkan jalur absolut di mana-mana.
misalnya. xcodebuild clean archive -archivePath /path/to/your/project/build/testDemo -scheme testDemo | xcpretty
di sini Anda perlu mengubah /path/to/your/project/jalur Anda dan testDemodengan nama proyek Anda.

Siddhartha S. Ikshavaku
sumber
0

Punya masalah yang sama tetapi selama membangun dengan xcode sebagai subproyek utama. Membuat subproyek dalam xcode standalone - setelah itu kesalahan ini menghilang.

htzfun
sumber
0

Saya menghadapi masalah ini dan bahkan jika beberapa jawaban di sini benar-benar memberikan solusi, saya tidak merasa sangat jelas. Jadi saya hanya akan menambahkan satu lagi. Singkatnya, cara berbagi skema dari excode.

Arahkan ke Product> Scheme>Manage Schemes

masukkan deskripsi gambar di sini

Anda kemudian akan ditampilkan daftar skema, dengan masing-masing dilambangkan sebagai yang dibagikan atau tidak. Cukup centang yang ingin Anda bagikan (mungkin berbeda untuk build dev dan prod)

masukkan deskripsi gambar di sini

Gambar diambil dari artikel ini https://developer.nevercode.io/docs/sharing-ios-project-schemes

Carlos Robles
sumber
0

Saya ingin menambahkan solusi untuk kasus saya terkait dengan utas ini. Yang ini untuk Anda yang mengkloning proyek yang ada, dengan semua skema yang Anda butuhkan sudah dibagikan:

masukkan deskripsi gambar di sini

, dengan fastlane lanesmenampilkan semua jalur Anda dengan benar termasuk semua skema Anda:

masukkan deskripsi gambar di sini

, tetapi fastlane gymhanya tampilkan skema utama (bukan skema dev dan pengujian):

masukkan deskripsi gambar di sini

Solusinya adalah hapus centang opsi bersama untuk skema yang tidak terdaftar oleh fastlane gymdan kemudian periksa lagi . Ini akan menghasilkan .xcscheme untuk skema:

masukkan deskripsi gambar di sini

Sekarang, jika Anda memeriksa fastlane gym, semua skema akan terdaftar:

masukkan deskripsi gambar di sini

Kemudian Anda harus memasukkan file .xcshemes tersebut ke repositori, sehingga pengembang lain yang mengkloning proyek akan mendapatkan file tersebut.

Seto Elkahfi
sumber
0

Bagi siapa pun dengan Xcode 11.4 yang mencoba menemukan tombol "Shared" pada skema, sekarang dipindahkan ke skema individual.

  1. Pilih skema yang Anda inginkan
  2. Tekan "Edit"
  3. Centang kotak "Dibagikan"

Edit Skema Berisi Kotak Bersama Sekarang

green0range
sumber