2010-01-24 25 views
29

Tôi có một ứng dụng khách < => ứng dụng máy chủ Tôi đang xây dựng cho Mac OS X, sử dụng Objective-c/Cocoa và xCode. Tôi đã tạo một dự án khác cho cả hai ứng dụng tôi có và tôi tự hỏi cách tốt nhất để chia sẻ các lớp học giữa chúng. Có một số lớp tôi đã thực hiện sẽ hữu ích cho cả hai. Điều này đến nay tôi đã được sao chép chúng xung quanh, nhưng tôi cảm thấy như thế này không phải là giải pháp tốt nhất.Chia sẻ các lớp học giữa các dự án trong xcode/objective-c

Tôi làm cách nào để chia sẻ các lớp học hiệu quả? Tôi có nên làm lại nó như 1 dự án và chỉ có hai mục tiêu xây dựng? Làm thế nào để tôi làm điều này?

Bất kỳ thông tin nào khác?

Cảm ơn.

Trả lời

12

Nếu bạn có hai hoặc nhiều sản phẩm sẽ chia sẻ một lượng mã phổ biến, như một bộ sản phẩm, bạn có thể xem xét việc tạo một dự án xcode đơn và sau đó thêm mục tiêu khác cho mỗi sản phẩm sẽ được xây dựng từ cả mã chia sẻ và mã sản phẩm cụ thể. Với rất nhiều mã chia sẻ, một cặp khách hàng/máy chủ của các sản phẩm có thể sẽ là ứng viên tuyệt vời cho việc đi theo cách này.

Luộc xuống, thỏa thuận cơ bản là đối với mỗi mục tiêu trong dự án xcode của bạn mà bạn muốn xây dựng, bạn chỉ định tệp nào sẽ được sử dụng để tạo tệp: tệp nguồn, nghệ thuật, xib và v.v. Bằng cách này, ví dụ, bạn có thể thiết lập sản phẩm khách hàng của bạn được xây dựng bằng cách sử dụng các tệp A, B, C, D, E, F và sản phẩm máy chủ của bạn sẽ được tạo bằng các tệp A, F, X, Y, Z.

Tôi thực sự thích có mọi sản phẩm liên quan sống dưới một dự án xcode đơn "mái", bởi vì bạn sẽ không phải nhảy xung quanh các dự án xcode và thực sự đơn giản hóa việc quản lý SCM cho các tệp được chia sẻ.

Dưới đây là một liên kết đến tài liệu của Apple về vấn đề này: https://developer.apple.com/library/mac/#featuredarticles/XcodeConcepts/Concept-Targets.html

Cập nhật: có một chút rắc rối thêm tham gia khi nói đến cấu hình tập tin tiêu đề mục tiêu cụ thể trong xcode (nó luôn luôn một cái gì đó ... phải không ?!); ví dụ: sử dụng "myHeaderA.h" cho mục tiêu này và "myHeaderB.h" cho mục tiêu đó. Đây là bài đăng tuyệt vời chia sẻ cách thực hiện: controlling which project header file Xcode will include. Thận trọng: sau khi bạn thiết lập mọi thứ theo cách này, xcode không còn biết bất kỳ đường dẫn nào để tìm kiếm bất kỳ tệp tiêu đề đích nào của bạn, do đó bạn phải thiết lập chúng theo cách thủ công. Để thực hiện việc này, nhấp chuột phải vào Nhận thông tin về mục tiêu của bạn, chọn Tạo danh mục, sau đó thêm đường dẫn của bạn qua cài đặt "Đường dẫn tìm kiếm tiêu đề". Các đường dẫn được tìm kiếm theo thứ tự bạn nhập vào.

+0

Điều này có thể được thực hiện với không gian làm việc mới ngay bây giờ không? –

+1

Có - Tôi hiện đang chạy Xcode 4.3.2 và không cần thay đổi gì cả. –

4

Cách tốt nhất là tạo một khung công tác riêng biệt chứa các lớp được chia sẻ. Điều này có thể được biên dịch một lần và được liên kết vào cả hai dự án ứng dụng.

Xem Apple's doc on what are Frameworks.

+2

Theo kinh nghiệm của tôi, các khung công tác chỉ phù hợp với mã mà bạn thực sự đã khóa; nơi bạn không mong đợi thay đổi. (Và, trong thực tế, điều đó không bao giờ xảy ra. Mọi thứ luôn thay đổi.) Âm thanh tốt trên giấy, nhưng khung công tác có xu hướng cản trở chúng, chúng cản trở sự phát triển và đổi mới nhanh chóng (bởi vì bạn không muốn thay đổi khuôn khổ bạn phá vỡ một cái gì đó trong một ứng dụng khác) và nói chung là một sự lựa chọn nghèo để chia sẻ mã, trừ khi bạn cập nhật thư viện của bạn mỗi năm một lần (ví dụ như Apple). – Womble

+1

@Làm tốt, không thay đổi bất kỳ thứ gì có thể làm hỏng thứ gì đó trong ứng dụng khác ...nếu bạn thấy mình muốn làm điều đó, sau đó đánh dấu phương pháp cũ là không được chấp nhận và viết một phương pháp mới ... –

2

Giải pháp nhanh nhất là chỉ thêm các tham chiếu của tệp .h và .m vào một trong các dự án. Chỉ cần bỏ chọn hộp kiểm "copy" trong phần "thêm tệp hiện có" -dialog trong xcode. Hãy nhớ rằng bạn cũng có thể cần sao chép các tệp được tham chiếu nếu bạn di chuyển/chia sẻ dự án của mình.

+1

Điều này sẽ chơi độc đáo với kiểm soát nguồn? Tôi đoán rằng giải pháp khung công tác sẽ hoạt động tự nhiên hơn với CVS và bạn bè. – Spina

1

Tôi đã tìm thấy một bài viết hay về chủ đề này tại đây: http://www.clintharris.net/2009/iphone-app-shared-libraries/ Câu trả lời cho câu hỏi của tôi cụ thể về nhiều ứng dụng chia sẻ mã iPhone. Nó không đề cập đến các khung công tác (ở trên) vì vậy tôi không thể nói nếu đề xuất của họ (tham khảo dự án xcode) so sánh thuận lợi với giải pháp khung công tác.

+0

Tình hình rất khác trên iPhone với hệ thống tệp và các hạn chế về thư viện được chia sẻ. –

11

Một cách rất hay để làm là đặt mã được chia sẻ vào hệ thống SCM và đưa nó vào từng dự án bạn muốn. Theo cách này, mọi dự án đều có thể chia sẻ mã, bạn có thể chỉnh sửa ở bất kỳ đâu và chỉ kiểm tra các thay đổi trở lại kiểm soát nguồn khi bạn cảm thấy tốt về nó - và sau đó tất cả các dự án khác được hưởng lợi từ công việc của bạn.

này có lợi thế lớn so với những cách khác để làm việc đó IMO:

vs khuôn khổ: Mã Bao bì vào một khuôn khổ là khá khó chịu, và bó-tin khuôn khổ mất một thời gian một cách vô lý dài để nạp - đặc biệt chỉ để có một vài lớp học vào ứng dụng của bạn. Wil Shipley thuộc Tập đoàn Omni (vào thời điểm đó) đã từng thấy rằng các khuôn khổ mà công ty đưa vào trong tất cả các ứng dụng của họ đã thêm vài giây vào thời gian bắt đầu của mỗi ứng dụng. Việc đóng gói các lớp riêng trong một khung công tác cũng có thể khuyến khích việc ghép nối nhiều hơn là cần thiết - nó thực sự hấp dẫn chỉ để tạo một Khung thực sự, nơi tất cả các lớp được chia sẻ của bạn cư trú, vì vậy bạn bắt đầu giả định mã này sẽ luôn luôn sống cùng nhau. và nó trở thành không thể tách rời. Về cơ bản, các khuôn khổ là một cái búa và vấn đề này là một ốc vít.

so với chỉ bao gồm tệp: Hy vọng bạn sẽ đưa ứng dụng của mình vào SCM tại một số điểm và chỉ cần đưa tệp vào vị trí tạo sự cố vì chúng sẽ bị thiếu SCM. Việc sao chép các tệp vào từng dự án sẽ đưa ra vấn đề ngược lại - mỗi dự án sẽ bao gồm phiên bản tệp của riêng nó và bạn sẽ phải tự lan truyền bất kỳ thay đổi hữu ích nào.

+2

Xin chào Chuck, tôi đang xem xét cách tiếp cận này nhưng tôi không chắc chắn những gì "đưa nó vào mỗi dự án bạn muốn nó trong" thực sự đòi hỏi. Bạn đang nói về việc làm một cái gì đó trong XCode hoặc có thể một cái gì đó giống như SVN externals tài sản? Chính xác ý của bạn là gì? Cảm ơn. – Cal

+1

Cảm ơn câu trả lời Chuck, điều này nghe giống như cách để đi với tôi. Tuy nhiên, tôi khá là một tân binh về chủ đề này. Bạn có nguồn nào có lời giải thích/ví dụ chi tiết hơn không? – Tom

+0

@chuck Bất kỳ cơ hội nào bạn gặp phải một hướng dẫn hoặc viết lên những gì bạn đề xuất? –

2

Tôi gặp sự cố tương tự và câu trả lời được chấp nhận ở trên có thể gây ra sự cố cho người mới.

Sẽ ổn nếu hai dự án giao tiếp bằng một số giao thức, ví dụ: TCP/IP hoặc nếu họ không giao tiếp. Tuy nhiên, nếu một dự án là một gói (ví dụ: một plugin) cần truy cập vào các lớp giống như một ứng dụng (trong khi đang chạy trong cùng một quy trình), bạn sẽ gặp vấn đề với liên kết hoặc cảnh báo thời gian chạy/lỗi về việc có các lớp có cùng tên. Cách đơn giản nhất để giải quyết vấn đề này là sử dụng một khung công tác. Với một khuôn khổ, bạn có thể thiết lập nó để cả ba mục tiêu đều nằm trong cùng một dự án, hoặc thậm chí bạn có thể bao gồm khung công tác trong các dự án riêng biệt.

Tôi đã có một dự án với một ứng dụng và một plugin bó, đây là các bước tôi đã chọn theo Xcode 6:

  1. Tạo một khuôn khổ, sao chép tất cả các mã chia sẻ qua.
  2. Trong tiêu đề chính của khung, bao gồm tiêu đề của tất cả mã được chia sẻ.
  3. Xây dựng khung để kiểm tra bản dựng (ví dụ: chọn sơ đồ khung và nhấp vào phát)
  4. Chuyển đến phần Xây dựng giai đoạn của cả Ứng dụng và Gói trình cắm và thêm khung mới để 'nhắm mục tiêu phụ thuộc' và 'Liên kết nhị phân với các thư viện'
  5. Để bao gồm các công cụ khung trong mã trong ứng dụng và bó, chỉ cần sử dụng các tiêu đề chính, và sử dụng <> chứ không phải là “" ví dụ như nếu khuôn khổ của bạn được gọi là Foo sử dụng #import

Các thay đổi đối với khung công tác sẽ được biên dịch tự động khi bạn chạy ứng dụng chính, vì vậy bạn có thể có hiệu lực bỏ qua mặt Chúng là những mục tiêu khác nhau.

Các vấn đề liên quan