Proyek Xcode vs Xcode Workspace - Perbedaan

403

Saya mencoba memahami bagaimana seluruh ekosistem iOSbekerja.
Sampai sekarang, saya dapat menemukan jawaban untuk sebagian besar pertanyaan saya (dan percayalah, ada banyak dari mereka), tetapi untuk yang ini, sepertinya belum ada jawaban yang jelas.

Apa perbedaan antara file XcodeProject dan XcodeWorkspace?

  1. Apa perbedaan keduanya?
  2. Untuk apa mereka bertanggung jawab?
  3. Di antara mereka yang mana saya harus bekerja dengan ketika saya mengembangkan Aplikasi saya di tim / sendirian?
  4. Apakah ada hal lain yang harus saya ketahui tentang kedua file ini?
ms2
sumber

Jawaban:

607

Saya pikir ada tiga hal utama yang perlu Anda pahami mengenai struktur proyek: Target , proyek , dan ruang kerja . Target menentukan secara terperinci bagaimana suatu produk / biner (yaitu, aplikasi atau perpustakaan) dibangun. Mereka termasuk pengaturan build, seperti flag compiler dan linker, dan mereka menentukan file mana (kode sumber dan sumber daya) yang benar-benar milik produk. Ketika Anda membangun / menjalankan, Anda selalu memilih satu target spesifik.

Kemungkinan Anda memiliki beberapa target yang membagikan kode dan sumber daya. Target yang berbeda ini dapat berupa versi aplikasi yang sedikit berbeda (iPad / iPhone, merek yang berbeda, ...) atau uji kasus yang secara alami perlu mengakses file sumber yang sama dengan aplikasi. Semua target terkait ini dapat dikelompokkan dalam suatu proyek . Sementara proyek berisi file-file dari semua targetnya, masing-masing target memilih sendiri subset dari file yang relevan. Hal yang sama berlaku untuk pengaturan build: Anda dapat menentukan pengaturan default proyek-lebar dalam proyek, tetapi jika salah satu target Anda membutuhkan pengaturan yang berbeda, Anda selalu dapat menimpanya di sana:

Pengaturan proyek bersama yang diwariskan semua target, kecuali jika ditimpa

Pengaturan proyek bersama yang diwariskan semua target, kecuali jika mereka menimpanya

Pengaturan target konkret: iPhone PSE menimpa pengaturan Base SDK proyek

Setelan target beton: PSE iPhone menimpa proyek Base SDKpengaturan

Dalam Xcode, Anda selalu membuka proyek (atau ruang kerja, tetapi bukan target), dan semua target yang dikandungnya dapat dibangun / dijalankan, tetapi tidak ada cara / definisi untuk membangun proyek, sehingga setiap proyek membutuhkan setidaknya satu target untuk menjadi lebih dari sekadar kumpulan file dan pengaturan.

Pilih salah satu target proyek untuk dijalankan

Pilih salah satu target proyek untuk dijalankan

Dalam banyak kasus, proyek adalah semua yang Anda butuhkan. Jika Anda memiliki ketergantungan yang Anda bangun dari sumber, Anda dapat menanamkannya sebagai sub proyek . Sub proyek dapat dibuka secara terpisah atau dalam proyek super mereka.

demoLib adalah subprojec

demoLib adalah sebuah sub proyek

Jika Anda menambahkan salah satu target sub proyek ke dependensi proyek super, sub proyek akan dibangun secara otomatis kecuali jika tetap tidak berubah. Keuntungannya di sini adalah Anda dapat mengedit file dari proyek Anda dan dependensi Anda di jendela Xcode yang sama, dan ketika Anda membangun / menjalankan, Anda dapat memilih dari target proyek dan sub proyeknya:

Menjalankan target dari suatu sub proyek

Namun, jika perpustakaan Anda (sub-proyek) digunakan oleh berbagai proyek lain (atau targetnya, tepatnya), masuk akal untuk meletakkannya di tingkat hierarki yang sama - itulah gunanya ruang kerja . Ruang kerja berisi dan mengelola proyek, dan semua proyek yang dikandungnya secara langsung (yaitu, bukan sub-proyeknya) berada pada tingkat yang sama dan targetnya dapat saling bergantung (target proyek dapat bergantung pada target subproyek, tetapi tidak sebaliknya).

Struktur ruang kerja

Struktur ruang kerja

Dalam contoh ini, kedua aplikasi ( AnotherApplication / ProjectStructureExample ) dapat mereferensikan target proyek demoLib . Ini juga dimungkinkan dengan memasukkan proyek demoLib di kedua proyek lain sebagai sub-proyek (yang hanya referensi, jadi tidak perlu duplikasi), tetapi jika Anda memiliki banyak dependensi silang, ruang kerja lebih masuk akal. Jika Anda membuka ruang kerja, Anda dapat memilih dari semua target proyek saat membangun / menjalankan.

Menjalankan target dari ruang kerja

Anda masih dapat membuka file proyek secara terpisah, tetapi kemungkinan targetnya tidak akan dibangun karena Xcode tidak dapat menyelesaikan dependensi kecuali Anda membuka file ruang kerja. Ruang kerja memberi Anda manfaat yang sama dengan sub-proyek: Begitu ketergantungan berubah, Xcode akan membangunnya kembali untuk memastikan itu mutakhir (walaupun saya memiliki beberapa masalah dengan itu, sepertinya tidak berfungsi dengan andal).

Singkatnya, pertanyaan Anda :

1) Proyek berisi file (kode / sumber daya), pengaturan, dan target yang membangun produk dari file dan pengaturan itu. Ruang kerja berisi proyek yang dapat saling referensi.

2) Keduanya bertanggung jawab untuk menyusun proyek Anda secara keseluruhan, tetapi pada tingkat yang berbeda.

3) Saya pikir proyek cukup dalam banyak kasus. Jangan gunakan ruang kerja kecuali ada alasan khusus. Plus, Anda selalu dapat menyematkan proyek Anda di ruang kerja nanti.

4) Saya pikir itulah gunanya teks di atas ...

Ada satu komentar untuk 3): CocoaPods , yang secara otomatis menangani pustaka pihak ke-3 untuk Anda, menggunakan ruang kerja. Karena itu, Anda harus menggunakannya juga, ketika Anda menggunakannya CocoaPods(yang dilakukan banyak orang).

hagi
sumber
7
Bisakah satu proyek menjadi bagian dari dua ruang kerja yang terpisah? Atau jika saya ingin berbagi satu proyek dengan dua proyek lain, apakah mereka perlu menjadi bagian dari ruang kerja yang sama?
Jack
8
Tentu saja, sebuah proyek dapat menjadi bagian dari sebanyak mungkin ruang kerja yang Anda inginkan. Menambahkan proyek ke ruang kerja tidak mengubah apa pun tentang proyek itu sendiri. Jadi, Anda memiliki banyak pilihan ... semua dalam satu ruang kerja, dua ruang kerja yang berbagi satu proyek, atau dua proyek yang memiliki proyek bersama sebagai sub proyek.
hagi
1
Saya tidak punya pengalaman dengan itu, tetapi README mengatakan: " Anda memegang kendali penuh atas struktur dan pengaturan proyek Anda ", dan " bukannya mengintegrasikan [dependensi] ke dalam satu ruang kerja, [...] dependensi Anda harus mencakup proyek Xcode mereka sendiri ". Singkatnya: Ini sama sekali tidak menyentuh proyek / ruang kerja Anda, jadi saya tidak melihat bagaimana saya harus memasukkannya dalam jawaban. Jawabannya masih membantu jika Anda menggunakan Carthage, terutama karena Anda harus memutuskan bagaimana menyusun dependensi Anda, tetapi tidak ada yang khusus untuk Carthage.
hagi
Dijelaskan dengan baik tentang hierarki Proyek. Jika saya menghapus / memindahkan proyek dari lokasi maka proyek akan tetap di proyek utama? stackoverflow.com/questions/40214505/…
Ganesh Guturi
File induk proyek memiliki referensi ke proyek, bukan salinan. Jika proyek dihapus, orang tua tidak akan menemukannya lagi. Biasanya, Anda ingin memastikan pada tingkat sistem file bahwa proyek induk memiliki salinan lokal dari semua sub-proyeknya. Manajer dependensi seperti CocoaPods atau Carthage akan melakukannya untuk Anda, atau Anda dapat menggunakan submit git.
hagi
103

Ruang kerja adalah kumpulan proyek. Sangat berguna untuk mengatur proyek Anda ketika ada korelasi di antara mereka (misalnya: Proyek A termasuk perpustakaan, yang disediakan sebagai proyek itu sendiri sebagai proyek B. Ketika Anda membangun ruang kerja proyek B dikompilasi dan dihubungkan dalam proyek A).
Adalah umum untuk menggunakan ruang kerja di CocoaPods yang populer . Ketika Anda menginstal pod Anda, mereka ditempatkan di dalam ruang kerja, yang menampung proyek Anda dan pustaka pod.

andreamazz
sumber
35

Secara singkat

  • Xcode 3 memperkenalkan subproyek, yang merupakan hubungan orangtua-anak, yang berarti bahwa orangtua dapat mereferensikan target anaknya, tetapi tidak ada sebaliknya
  • Xcode 4 memperkenalkan ruang kerja, yang merupakan hubungan saudara, yang berarti bahwa setiap proyek dapat merujuk proyek di ruang kerja yang sama
onmyway133
sumber
2

Ketika saya menggunakan CocoaPods untuk mengembangkan proyek iOS, ada .xcworkspacefile, Anda harus membuka proyek dengan .xcworkspacefile yang terkait dengan CocoaPods.

Pratinjau file

Tetapi ketika Anda Show Package Contentsdengan .xcworkspacefile, Anda akan menemukan contents.xcworkspacedatafile.

Isi paket

<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "group:BluetoothColorLamp24G.xcodeproj">
   </FileRef>
   <FileRef
      location = "group:Pods/Pods.xcodeproj">
   </FileRef>
</Workspace>

perhatikan baris ini:

location = "group:BluetoothColorLamp24G.xcodeproj"

The .xcworkspaceberkas memiliki referensi dengan .xcodeprojberkas.

Pengembangan lingkungan:

macOS 10.14
Xcode 10.1
ifeegoo
sumber
2
  1. Apa perbedaan keduanya?
    Ruang kerja adalah sekumpulan proyek

  2. Untuk apa mereka bertanggung jawab?
    Proyek bertanggung jawab atas kode sumber. Ruang kerja bertanggung jawab atas ketergantungan antar proyek

  3. Di antara mereka yang mana saya harus bekerja dengan ketika saya mengembangkan Aplikasi saya di tim / sendirian?
    Pilihan Anda harus tergantung pada jenis proyek Anda. Misalnya jika proyek Anda bergantung pada manajer dependensi CocoaPods, ia menciptakan ruang kerja.

  4. Apakah ada hal lain yang harus saya ketahui tentang kedua file ini?
    Pesaing ruang kerja adalah cross-project references[Tentang]

[Komponen Xcode]

yoAlex5
sumber