โครงการ Xcode กับพื้นที่ทำงาน Xcode - ความแตกต่าง


402

ฉันพยายามเข้าใจว่าระบบนิเวศทั้งหมดiOSทำงานอย่างไร
จนถึงตอนนี้ฉันสามารถหาคำตอบสำหรับคำถามส่วนใหญ่ของฉัน (และเชื่อฉันมีจำนวนมาก) แต่สำหรับคนนี้ดูเหมือนจะยังไม่มีคำตอบที่ชัดเจน

ความแตกต่างระหว่างไฟล์ XcodeProject และ XcodeWorkspace คืออะไร

  1. ความแตกต่างระหว่างสองของพวกเขาคืออะไร?
  2. พวกเขารับผิดชอบอะไร
  3. ฉันควรทำงานกับหนึ่งในนั้นเมื่อฉันพัฒนาแอพของฉันในทีม / คนเดียว?
  4. มีอะไรอีกบ้างที่ฉันควรระวังในเรื่องของไฟล์ทั้งสองนี้?

คำตอบ:


606

ผมคิดว่ามีสามรายการที่สำคัญคุณต้องเข้าใจเกี่ยวกับโครงสร้างโครงการ: เป้าหมาย , โครงการและพื้นที่ทำงาน เป้าหมายระบุรายละเอียดวิธีสร้างผลิตภัณฑ์ / ไบนารี (เช่นแอปพลิเคชันหรือไลบรารี) พวกเขารวมถึงการตั้งค่าการสร้างเช่นธงคอมไพเลอร์และลิงเกอร์และพวกเขากำหนดไฟล์ (รหัสแหล่งที่มาและทรัพยากร) จริงเป็นของผลิตภัณฑ์ เมื่อคุณสร้าง / เรียกใช้คุณจะต้องเลือกเป้าหมายหนึ่งเป้าหมายเสมอ

เป็นไปได้ว่าคุณมีเป้าหมายสองสามอย่างที่ใช้รหัสและทรัพยากรร่วมกัน เป้าหมายที่แตกต่างกันเหล่านี้อาจเป็นแอพเวอร์ชันที่แตกต่างกันเล็กน้อย (iPad / iPhone, แบรนด์ที่แตกต่าง, ... ) หรือกรณีทดสอบที่จำเป็นต้องเข้าถึงไฟล์ต้นฉบับเดียวกันกับแอพ เป้าหมายที่เกี่ยวข้องทั้งหมดเหล่านี้สามารถจัดกลุ่มในโครงการได้ ในขณะที่โครงการมีไฟล์จากเป้าหมายทั้งหมดของมันแต่ละเป้าหมายจะเลือกไฟล์ย่อยที่เกี่ยวข้องของตัวเอง เช่นเดียวกันสำหรับการตั้งค่าการสร้าง: คุณสามารถกำหนดการตั้งค่าเริ่มต้นทั้งโครงการในโครงการได้ แต่ถ้าหนึ่งในเป้าหมายของคุณต้องการการตั้งค่าที่แตกต่างกันคุณสามารถแทนที่พวกเขาได้ที่นั่น:

การตั้งค่าโครงการที่ใช้ร่วมกันซึ่งเป้าหมายทั้งหมดสืบทอดเว้นแต่ว่าพวกเขาจะเขียนทับมัน

การตั้งค่าโครงการที่ใช้ร่วมกันซึ่งเป้าหมายทั้งหมดสืบทอดมาเว้นแต่ว่าพวกเขาแทนที่มัน

การตั้งค่าเป้าหมายที่เป็นรูปธรรม: PSE iPhone จะเขียนทับการตั้งค่าฐาน SDK ของโครงการ

การตั้งค่าเป้าหมายคอนกรีต: PSE iPhoneจะแทนที่การBase SDKตั้งค่าของโครงการ

ใน Xcode คุณจะเปิดโครงการ (หรือพื้นที่ทำงาน แต่ไม่ใช่เป้าหมาย) เสมอและเป้าหมายทั้งหมดที่มีอยู่สามารถสร้าง / เรียกใช้ แต่ไม่มีวิธี / คำจำกัดความของการสร้างโครงการดังนั้นทุกโครงการต้องมีเป้าหมายอย่างน้อยหนึ่งเป้าหมายเพื่อ เป็นมากกว่าชุดของไฟล์และการตั้งค่า

เลือกหนึ่งในเป้าหมายของโครงการที่จะเรียกใช้

เลือกหนึ่งในเป้าหมายของโครงการที่จะเรียกใช้

ในหลายกรณีโครงการเป็นสิ่งที่คุณต้องการ หากคุณมีการพึ่งพาที่คุณสร้างจากแหล่งที่คุณสามารถฝังเป็นโครงการย่อย โครงการย่อยสามารถเปิดแยกต่างหากหรือภายในโครงการสุดของพวกเขา

demoLib เป็นโปรแกรมย่อย

demoLibเป็นโครงการย่อย

หากคุณเพิ่มหนึ่งในเป้าหมายของโครงการย่อยในการขึ้นต่อกันของโครงการพิเศษโครงการย่อยจะถูกสร้างขึ้นโดยอัตโนมัติเว้นแต่มันจะไม่เปลี่ยนแปลง ข้อดีที่นี่คือคุณสามารถแก้ไขไฟล์จากทั้งโครงการและการอ้างอิงของคุณในหน้าต่าง Xcode เดียวกันและเมื่อคุณสร้าง / เรียกใช้คุณสามารถเลือกจากเป้าหมายของโครงการและโครงการย่อย:

เรียกใช้เป้าหมายจากโครงการย่อย

อย่างไรก็ตามหากไลบรารีของคุณ (โครงการย่อย) ถูกใช้โดยโครงการอื่น ๆ (หรือเป้าหมายของพวกเขาเพื่อให้แม่นยำ) มันเหมาะสมที่จะวางไว้ในระดับลำดับชั้นเดียวกันนั่นเป็นสิ่งที่เวิร์กสเปซใช้ เวิร์กสเปซประกอบด้วยและจัดการโครงการและโครงการทั้งหมดที่มีโดยตรง (เช่นไม่ใช่โครงการย่อย) อยู่ในระดับเดียวกันและเป้าหมายสามารถพึ่งพากันได้ (เป้าหมายของโครงการสามารถขึ้นอยู่กับเป้าหมายของโครงการย่อย แต่ไม่ใช่ในทางกลับกัน)

โครงสร้างพื้นที่ทำงาน

โครงสร้างพื้นที่ทำงาน

ในตัวอย่างนี้แอปทั้งสอง ( AnotherApplication / ProjectStructureExample ) สามารถอ้างอิงเป้าหมายของโครงการdemoLib สิ่งนี้อาจเป็นไปได้ด้วยการรวมโครงการdemoLibในทั้งสองโครงการเป็นโครงการย่อย (ซึ่งเป็นข้อมูลอ้างอิงเท่านั้นดังนั้นจึงไม่จำเป็นต้องทำซ้ำ) แต่ถ้าคุณมีการพึ่งพาข้ามจำนวนมากเวิร์กสเปซจะสมเหตุสมผลมากขึ้น หากคุณเปิดเวิร์กสเปซคุณสามารถเลือกจากเป้าหมายของโครงการทั้งหมดเมื่อสร้าง / รัน

เรียกใช้เป้าหมายจากพื้นที่ทำงาน

คุณยังคงสามารถเปิดไฟล์โครงการของคุณแยกกันได้ แต่เป็นไปได้ว่าเป้าหมายของพวกเขาจะไม่สร้างเพราะ Xcode ไม่สามารถแก้ไขการขึ้นต่อกันได้เว้นแต่คุณจะเปิดไฟล์เวิร์กสเปซ เวิร์กสเปซให้ผลประโยชน์เช่นเดียวกับโครงการย่อย: เมื่อมีการเปลี่ยนแปลงการพึ่งพา Xcode จะสร้างขึ้นใหม่เพื่อให้แน่ใจว่าเป็นข้อมูลล่าสุด (แม้ว่าฉันมีปัญหาบางอย่างกับเรื่องนี้

คำถามของคุณสั้น ๆ :

1) โปรเจ็กต์ประกอบด้วยไฟล์ (รหัส / การใช้ทรัพยากร) การตั้งค่าและเป้าหมายที่สร้างผลิตภัณฑ์จากไฟล์และการตั้งค่าเหล่านั้น พื้นที่ทำงานมีโครงการที่สามารถอ้างอิงซึ่งกันและกัน

2) ทั้งสองรับผิดชอบโครงสร้างโครงการโดยรวมของคุณ แต่ในระดับที่แตกต่างกัน

3) ฉันคิดว่าโครงการส่วนใหญ่เพียงพอแล้ว อย่าใช้พื้นที่ทำงานเว้นแต่มีเหตุผลเฉพาะ นอกจากนี้คุณสามารถฝังโครงการในพื้นที่ทำงานในภายหลัง

4) ฉันคิดว่านั่นคือข้อความข้างบนสำหรับ ...

มีหนึ่งข้อสังเกตสำหรับ 3): CocoaPodsซึ่งจัดการห้องสมุดบุคคลที่สามโดยอัตโนมัติสำหรับคุณใช้พื้นที่ทำงาน ดังนั้นคุณต้องใช้มันเช่นกันเมื่อคุณใช้CocoaPods(ซึ่งผู้คนจำนวนมากทำ)


7
โครงการหนึ่งสามารถเป็นส่วนหนึ่งของพื้นที่ทำงานสองแห่งแยกกันได้หรือไม่? หรือถ้าฉันต้องการแบ่งปันโครงการหนึ่งกับอีกสองโครงการพวกเขาจะต้องเป็นส่วนหนึ่งของพื้นที่ทำงานเดียวกันหรือไม่
แจ็ค

8
แน่นอนโครงการสามารถเป็นส่วนหนึ่งของพื้นที่ทำงานได้มากเท่าที่คุณต้องการ การเพิ่มโครงการไปยังพื้นที่ทำงานไม่ได้เปลี่ยนแปลงอะไรเกี่ยวกับตัวโครงการเอง ดังนั้นคุณมีตัวเลือกมากมาย ... ทั้งหมดในพื้นที่ทำงานหนึ่งพื้นที่ทำงานสองแห่งที่ใช้หนึ่งโครงการหรือสองโครงการที่มีโครงการที่ใช้ร่วมกันเป็นโครงการย่อย
hagi

1
ฉันไม่มีประสบการณ์ใด ๆ กับมัน แต่READMEพูดว่า: " คุณยังคงควบคุมโครงสร้างโครงการและการตั้งค่าของคุณได้อย่างเต็มที่ " และ " แทนที่จะรวม [การพึ่งพา] ไว้ในที่ทำงานเดียว [... ] การพึ่งพาของคุณต้องรวม โครงการ Xcode ของพวกเขาเอง ". กล่าวโดยย่อ: มันไม่ได้สัมผัสโครงการ / พื้นที่ทำงานของคุณเลยดังนั้นฉันจึงไม่เห็นว่าควรรวมไว้ในคำตอบอย่างไร คำตอบยังคงมีประโยชน์หากคุณใช้คาร์เธจโดยเฉพาะอย่างยิ่งเมื่อคุณต้องตัดสินใจว่าจะจัดโครงสร้างการพึ่งพาของคุณได้อย่างไร
hagi

อธิบายอย่างดีเกี่ยวกับลำดับชั้นของโครงการ หากฉันลบ / ย้ายโครงการย่อยออกจากที่ตั้งโครงการย่อยจะอยู่ในโครงการหลักหรือไม่ stackoverflow.com/questions/40214505/…
Ganesh Guturi

ไฟล์โครงการหลักมีการอ้างอิงถึงโครงการย่อยไม่ใช่สำเนา หากโครงการย่อยถูกลบผู้ปกครองจะไม่พบมันอีก โดยทั่วไปคุณต้องการตรวจสอบให้แน่ใจในระดับระบบไฟล์ว่าโครงการหลักมีสำเนาในเครื่องของโครงการย่อยทั้งหมด ผู้จัดการการพึ่งพาเช่น CocoaPods หรือ Carthage จะทำเพื่อคุณหรือคุณสามารถใช้ submodules คอมไพล์
hagi

103

เวิร์กสเปซคือชุดของโครงการ เป็นประโยชน์ในการจัดระเบียบโครงการของคุณเมื่อมีความสัมพันธ์ระหว่างกัน (เช่น: โครงการ A มีไลบรารีที่ให้ไว้ในโครงการเป็นโครงการ B เมื่อคุณสร้างพื้นที่ทำงานโครงการ B จะถูกรวบรวมและเชื่อมโยงในโครงการ A)
มันเป็นเรื่องธรรมดาที่จะใช้พื้นที่ทำงานเป็นที่นิยมในCocoaPods เมื่อคุณติดตั้งพ็อดของคุณจะถูกวางไว้ในเวิร์กสเปซซึ่งเป็นเจ้าของโปรเจ็กต์และไลบรารีพ็อด


35

โดยสังเขป

  • Xcode 3 แนะนำโครงการย่อยซึ่งเป็นความสัมพันธ์ระหว่างพ่อแม่และลูกซึ่งหมายความว่าผู้ปกครองสามารถอ้างอิงเป้าหมายลูกได้ แต่ไม่มีทางกลับกัน
  • Xcode 4 แนะนำพื้นที่ทำงานซึ่งเป็นความสัมพันธ์แบบพี่น้องหมายความว่าโครงการใด ๆ สามารถอ้างอิงโครงการในพื้นที่ทำงานเดียวกัน

2

เมื่อฉันใช้ CocoaPods เพื่อพัฒนาโครงการ iOS มี.xcworkspaceไฟล์คุณต้องเปิดโครงการด้วย.xcworkspaceไฟล์ที่เกี่ยวข้องกับ CocoaPods

ดูตัวอย่างไฟล์

แต่เมื่อคุณShow Package Contentsมี.xcworkspaceไฟล์คุณจะพบcontents.xcworkspacedataไฟล์

เนื้อหาแพคเกจ

<?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>

ใส่ใจกับสายนี้:

location = "group:BluetoothColorLamp24G.xcodeproj"

.xcworkspaceไฟล์มีการอ้างอิงกับ.xcodeprojไฟล์

การพัฒนาสภาพแวดล้อม:

macOS 10.14
Xcode 10.1

2
  1. ความแตกต่างระหว่างสองของพวกเขาคืออะไร?
    เวิร์กสเปซคือชุดของโครงการ

  2. พวกเขารับผิดชอบอะไร
    โครงการมีหน้าที่รับผิดชอบซอร์สโค้ด พื้นที่ทำงานมีหน้าที่รับผิดชอบต่อการพึ่งพาระหว่างโครงการ

  3. ฉันควรทำงานกับหนึ่งในนั้นเมื่อฉันพัฒนาแอพของฉันในทีม / คนเดียว?
    ทางเลือกของคุณควรขึ้นอยู่กับประเภทของโครงการของคุณ ตัวอย่างเช่นหากโครงการของคุณอาศัยผู้จัดการการพึ่งพา CocoaPods มันจะสร้างพื้นที่ทำงาน

  4. มีอะไรอีกบ้างที่ฉันควรระวังในเรื่องของไฟล์ทั้งสองนี้?
    คู่แข่งของเวิร์กสเปซคือcross-project references[เกี่ยวกับ]

[องค์ประกอบ Xcode]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.