Dự án Xcode so với Xcode Workspace - Sự khác biệt


402

Tôi đang cố gắng hiểu làm thế nào toàn bộ hệ sinh thái iOShoạt động.
Cho đến bây giờ, tôi có thể tìm thấy câu trả lời cho hầu hết câu hỏi của mình (và tin tôi đi, đã có rất nhiều câu hỏi), nhưng đối với câu hỏi này, dường như vẫn chưa có câu trả lời rõ ràng.

Sự khác biệt giữa các tệp XcodeProject và XcodeWorkspace là gì?

  1. Sự khác biệt giữa hai người họ là gì?
  2. Họ chịu trách nhiệm về cái gì?
  3. Tôi nên làm việc với ai trong số họ khi tôi đang phát triển Ứng dụng của mình trong nhóm / một mình?
  4. Có bất cứ điều gì khác tôi nên nhận thức về vấn đề của hai tập tin này?

Câu trả lời:


606

Tôi nghĩ có ba mục chính bạn cần hiểu về cấu trúc dự án: Mục tiêu , dự ánkhông gian làm việc . Mục tiêu xác định chi tiết cách thức sản phẩm / nhị phân (nghĩa là ứng dụng hoặc thư viện) được xây dựng. Chúng bao gồm các cài đặt bản dựng, chẳng hạn như cờ trình biên dịch và trình liên kết và chúng xác định tệp nào (mã nguồn và tài nguyên) thực sự thuộc về một sản phẩm. Khi bạn xây dựng / chạy, bạn luôn chọn một mục tiêu cụ thể.

Có khả năng là bạn có một vài mục tiêu chia sẻ mã và tài nguyên. Các mục tiêu khác nhau này có thể là các phiên bản hơi khác nhau của một ứng dụng (iPad / iPhone, nhãn hiệu khác nhau, khác) hoặc các trường hợp thử nghiệm mà đương nhiên cần phải truy cập cùng các tệp nguồn như ứng dụng. Tất cả các mục tiêu liên quan này có thể được nhóm lại trong một dự án . Trong khi dự án chứa các tệp từ tất cả các mục tiêu của nó, mỗi mục tiêu chọn tập hợp con của các tệp có liên quan. Điều tương tự cũng xảy ra với các cài đặt xây dựng: Bạn có thể xác định các cài đặt toàn dự án mặc định trong dự án, nhưng nếu một trong các mục tiêu của bạn cần các cài đặt khác nhau, bạn luôn có thể ghi đè lên chúng ở đó:

Cài đặt dự án được chia sẻ mà tất cả các mục tiêu kế thừa, trừ khi chúng ghi đè lên nó

Cài đặt dự án được chia sẻ mà tất cả các mục tiêu kế thừa, trừ khi chúng ghi đè lên nó

Cài đặt mục tiêu cụ thể: iPhone PSE ghi đè cài đặt SDK cơ sở của dự án

Cài đặt mục tiêu cụ thể: iPhone PSE ghi đè Base SDKcài đặt của dự án

Trong Xcode, bạn luôn mở các dự án (hoặc không gian làm việc, nhưng không phải mục tiêu) và tất cả các mục tiêu mà nó chứa có thể được xây dựng / chạy, nhưng không có cách nào / định nghĩa về việc xây dựng dự án, vì vậy mọi dự án đều cần ít nhất một mục tiêu để không chỉ là một bộ sưu tập các tập tin và cài đặt.

Chọn một trong những mục tiêu của dự án để chạy

Chọn một trong những mục tiêu của dự án để chạy

Trong rất nhiều trường hợp, các dự án là tất cả những gì bạn cần. Nếu bạn có một phụ thuộc mà bạn xây dựng từ nguồn, bạn có thể nhúng nó dưới dạng một tiểu dự án . Các tiểu dự án có thể được mở riêng hoặc trong siêu dự án của họ.

demoLib là một chương trình con

demoLib là một tiểu dự án

Nếu bạn thêm một trong các mục tiêu của tiểu dự án vào các phụ thuộc của siêu dự án, thì tiểu dự án sẽ được tạo tự động trừ khi nó không thay đổi. Ưu điểm ở đây là bạn có thể chỉnh sửa các tệp từ cả dự án và các phụ thuộc của mình trong cùng một cửa sổ Xcode và khi bạn xây dựng / chạy, bạn có thể chọn từ các mục tiêu của dự án và các dự án con của dự án:

Chạy mục tiêu từ một tiểu dự án

Tuy nhiên, nếu thư viện của bạn (tiểu dự án) được sử dụng bởi nhiều dự án khác (hoặc mục tiêu của chúng, chính xác), thì nên đặt nó ở cùng một cấp bậc - đó là không gian làm việc dành cho. Không gian làm việc chứa và quản lý dự án và tất cả các dự án mà nó bao gồm trực tiếp (nghĩa là không phải là tiểu dự án của chúng) ở cùng cấp độ và các mục tiêu của chúng có thể phụ thuộc lẫn nhau (mục tiêu của dự án có thể phụ thuộc vào mục tiêu của tiểu dự án, nhưng không phải ngược lại).

Cấu trúc không gian làm việc

Cấu trúc không gian làm việc

Trong ví dụ này, cả hai ứng dụng ( AnotherApplication / ProjectStr structExample ) có thể tham chiếu các mục tiêu của dự án demoLib . Điều này cũng có thể bằng cách đưa dự án demoLib vào cả hai dự án khác làm dự án con (chỉ là tài liệu tham khảo, vì vậy không cần sao chép), nhưng nếu bạn có nhiều phụ thuộc chéo, không gian làm việc sẽ có ý nghĩa hơn. Nếu bạn mở một không gian làm việc, bạn có thể chọn từ tất cả các mục tiêu của dự án khi xây dựng / chạy.

Chạy mục tiêu từ không gian làm việc

Bạn vẫn có thể mở các tệp dự án của mình một cách riêng biệt, nhưng có khả năng các mục tiêu của chúng sẽ không được xây dựng vì Xcode không thể giải quyết các phụ thuộc trừ khi bạn mở tệp không gian làm việc. Không gian làm việc mang lại cho bạn lợi ích tương tự như các tiểu dự án: Một khi sự phụ thuộc thay đổi, Xcode sẽ xây dựng lại nó để đảm bảo nó được cập nhật (mặc dù tôi đã gặp một số vấn đề với điều đó, nhưng nó dường như không hoạt động đáng tin cậy).

Câu hỏi của bạn một cách ngắn gọn :

1) Dự án chứa các tệp (mã / nguồn), cài đặt và mục tiêu xây dựng sản phẩm từ các tệp và cài đặt đó. Không gian làm việc chứa các dự án có thể tham chiếu lẫn nhau.

2) Cả hai đều chịu trách nhiệm cấu trúc dự án tổng thể của bạn, nhưng ở các cấp độ khác nhau.

3) Tôi nghĩ rằng các dự án là đủ trong hầu hết các trường hợp. Đừng sử dụng không gian làm việc trừ khi có lý do cụ thể. Thêm vào đó, bạn luôn có thể nhúng dự án của bạn vào một không gian làm việc sau này.

4) Tôi nghĩ đó là những gì văn bản trên dành cho giáo dục

Có một nhận xét cho 3): CocoaPods , tự động xử lý các thư viện của bên thứ 3 cho bạn, sử dụng các không gian làm việc. Do đó, bạn cũng phải sử dụng chúng khi bạn sử dụng CocoaPods(điều mà rất nhiều người làm).


7
Một dự án có thể là một phần của hai không gian làm việc riêng biệt không? Hoặc nếu tôi muốn chia sẻ một dự án với hai dự án khác thì tất cả chúng có cần phải là một phần của cùng một không gian làm việc không?
Jack

8
Hoàn toàn có thể, một dự án có thể là một phần của nhiều không gian làm việc như bạn muốn. Thêm một dự án vào một không gian làm việc sẽ không thay đổi bất cứ điều gì về chính dự án. Vì vậy, bạn có nhiều tùy chọn ... tất cả trong một không gian làm việc, hai không gian làm việc chia sẻ một dự án hoặc hai dự án có dự án được chia sẻ dưới dạng một dự án con.
hagi

1
Tôi không có bất kỳ kinh nghiệm nào với nó, nhưng README nói: " bạn giữ toàn quyền kiểm soát cấu trúc và thiết lập dự án của mình " và " thay vì tích hợp [phụ thuộc] vào một không gian làm việc, [...] các phụ thuộc của bạn phải bao gồm dự án Xcode của riêng họ ". Nói tóm lại: Nó hoàn toàn không chạm vào các dự án / không gian làm việc của bạn, vì vậy tôi không thấy tôi nên đưa nó vào câu trả lời như thế nào. Câu trả lời vẫn hữu ích nếu bạn sử dụng Carthage, đặc biệt là khi bạn phải quyết định cách cấu trúc các phần phụ thuộc của mình, nhưng không có phần nào cụ thể cho Carthage.
hagi

Giải thích tốt về phân cấp dự án. Nếu tôi loại bỏ / di chuyển tiểu dự án khỏi vị trí thì tiểu dự án sẽ ở lại trong dự án chính? stackoverflow.com/questions/40214505/ từ
Ganesh Guturi

Tệp dự án mẹ có tham chiếu đến tiểu dự án, không phải bản sao. Nếu tiểu dự án bị xóa, phụ huynh sẽ không tìm thấy nó nữa. Thông thường, bạn muốn đảm bảo ở cấp hệ thống tệp rằng dự án mẹ có các bản sao cục bộ của tất cả các dự án con của nó. Các nhà quản lý phụ thuộc như CocoaPods hoặc Carthage sẽ làm điều đó cho bạn hoặc bạn có thể sử dụng các mô hình con git.
hagi

103

Một không gian làm việc là một tập hợp các dự án. Thật hữu ích khi tổ chức các dự án của bạn khi có mối tương quan giữa chúng (ví dụ: Dự án A bao gồm một thư viện, được cung cấp như một dự án như dự án B. Khi bạn xây dựng dự án không gian làm việc B được biên dịch và liên kết trong dự án A).
Việc sử dụng một không gian làm việc trong các Cốc Cốc phổ biến là rất phổ biến . Khi bạn cài đặt các nhóm của mình, chúng được đặt bên trong một không gian làm việc, chứa các dự án của bạn và các thư viện nhóm.


35

Tóm lại

  • Xcode 3 đã giới thiệu tiểu dự án, là mối quan hệ cha-con, có nghĩa là cha mẹ có thể tham chiếu mục tiêu con của nó, nhưng không có ngược lại
  • Xcode 4 đã giới thiệu không gian làm việc, đó là mối quan hệ anh em, có nghĩa là bất kỳ dự án nào cũng có thể tham chiếu các dự án trong cùng một không gian làm việc

2

Khi tôi sử dụng CocoaPods để phát triển các dự án iOS, có một .xcworkspacetệp, bạn cần mở dự án với .xcworkspacetệp có liên quan đến CocoaPods.

Xem trước tập tin

Nhưng khi bạn Show Package Contentsvới .xcworkspacetập tin, bạn sẽ tìm thấy contents.xcworkspacedatatập tin.

Nội dung gói

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

chú ý đến dòng này:

location = "group:BluetoothColorLamp24G.xcodeproj"

Các .xcworkspacetập tin có tham chiếu với các .xcodeprojtập tin.

Môi trương phat triển:

macOS 10.14
Xcode 10.1

2
  1. Sự khác biệt giữa hai người họ là gì?
    Không gian làm việc là một tập hợp các dự án

  2. Họ chịu trách nhiệm về cái gì?
    Dự án chịu trách nhiệm về mã nguồn. Không gian làm việc chịu trách nhiệm cho sự phụ thuộc giữa các dự án

  3. Tôi nên làm việc với ai trong số họ khi tôi đang phát triển Ứng dụng của mình trong nhóm / một mình?
    Bạn lựa chọn nên phụ thuộc vào một loại dự án của bạn. Ví dụ: nếu dự án của bạn phụ thuộc vào trình quản lý phụ thuộc của Cốc Cốc, nó sẽ tạo ra một không gian làm việc.

  4. Có bất cứ điều gì khác tôi nên nhận thức về vấn đề của hai tập tin này?
    Đối thủ của không gian làm việc là cross-project references[Giới thiệu]

[Thành phần Xcode]

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.