2013-05-08 27 views
26

Tôi gặp sự cố khi tải không gian làm việc của mình để biên dịch chính xác với Cocoapods. Có 3 dự án trong vùng làm việc, đều có mục tiêu riêng của họ:Định cấu hình Cocoapods bằng thư viện tĩnh hiện có và ứng dụng iOS

  1. libPods - Cocoapods thư viện tĩnh với tất cả các phụ thuộc bên ngoài
  2. libCommon - thư viện tĩnh của tôi, nơi tôi giữ tất cả các mã chia sẻ của tôi (điều khiển cơ sở, mạng mã, giao diện người dùng thông thường, vv)
  3. MyApp - ứng dụng iOS My

Cả libCommon và MyApp đòi hỏi sự phụ thuộc bên ngoài từ libPods. Ban đầu tôi nghĩ rằng nó sẽ làm việc như thế này:

  1. libPods xây dựng
  2. liên kết libCommon chống libPods và xây dựng
  3. liên kết MyApp với libCommon và xây dựng

Trong kịch bản này libCommon "sở hữu" các cụm và sau đó myApp chỉ liên kết với libCommon như tôi đã luôn luôn làm trước Cocoapods ... nhưng dường như các thư viện tĩnh không thích được liên kết với các thư viện tĩnh (tôi nhận được một loạt các lỗi thư viện động). Tôi đọc trên một vấn đề github một nơi nào đó mà thay vào đó tôi nên xây dựng libPods và libCommon và sau đó myApp nên liên kết với cả hai thư viện. Ngay bây giờ podfile của tôi trông giống như sau:

workspace 'MyApp.xcworkspace' 
platform :ios, '5.0' 

link_with ['Common', 'MyApp'] 

target 'MyApp' do 
    xcodeproj 'MyApp.xcodeproj' 

    pod 'AFNetworking',    '1.1.0' 
    pod 'TTTAttributedLabel',   '1.6.0' 
    pod 'JSONKit',     '1.5pre' 
    pod 'Reachability',    '3.1.0' 
end 

Với thiết lập này, MyApp sở hữu tất cả các cụm, và sau đó trong libCommon xây dựng các thiết lập tôi chỉ định đường dẫn đến các tiêu đề pod. Điều này xây dựng OK cho đến khi tôi cố gắng sử dụng một trong các lớp trong libCommon. Một khi tôi làm điều đó, tôi nhận được một trong những lỗi _OBJC_CLASS_$_Blah (mà nói với tôi rằng mặc dù các tiêu đề có sẵn, nó vẫn không được liên kết đúng cách). Khi tôi cố gắng để tự liên kết libCommon trong "Xây dựng giai đoạn", tôi nhận được một loạt các lỗi biểu tượng trùng lặp (mà lá tôi tin rằng nó đã được liên kết?). Cái quái gì thế?

Cách để thực hiện việc này đúng cách và podfile của tôi sẽ trông như thế nào?

Trả lời

10

CocoaPods tạo ra một mục tiêu gốc ngầm mà theo mặc định liên kết với mục tiêu đầu tiên của dự án. Khi bạn đang tạo một mục tiêu khác và tùy chọn link_with không được thừa kế bởi các định nghĩa đích của trẻ, thiết lập của bạn không hoạt động. Để tạo tùy chọn link_with, bạn có thể di chuyển nó bên trong khối của định nghĩa đích của MyApp.

Vì mục tiêu chung liên kết với Pod, nếu bạn liên kết những mục đó với MyApp, nó sẽ dẫn đến lỗi biểu tượng trùng lặp khi ứng dụng liên kết với Common. Trong trường hợp này, bạn chỉ cần làm cho các tiêu đề có sẵn cho mục tiêu MyApp. Điều này là đơn giản để làm nhưng không có một DSL thích hợp nào được nêu ra cho thời điểm này là một chút hacky như là một giải pháp (nhưng được hỗ trợ).

workspace 'MyApp.xcworkspace' 
platform :ios, '5.0' 

target 'Common' do 
    pod 'AFNetworking',    '1.1.0' 
    pod 'TTTAttributedLabel',   '1.6.0' 
    pod 'JSONKit',     '1.5pre' 
    pod 'Reachability',    '3.1.0' 

    target 'MyApp', :exclusive => true do 
    xcodeproj 'MyApp.xcodeproj' 
    end 
end 
+0

Tôi không có ý tưởng làm thế nào bạn đang rất nhanh chóng để trả lời cocoapods, Fabio, nhưng chỉ là một lưu ý rằng nó được nhiều đánh giá cao! Tôi đã có một vấn đề tương tự trước đây, và tùy chọn 'độc quyền' giải quyết nó. – Stew

+0

Tôi đã thiết lập như bạn đã đề xuất và mục tiêu MyApp biên dịch thành công cho đến khi tôi cố gắng sử dụng một lớp từ Common (ví dụ: thêm dòng này: MyObject * objectFromCommon = [[MyObject alloc] init]; kết quả trong _OBJC_CLASS_ $ Lỗi _MyObject). Tuy nhiên, việc đánh dấu cú pháp/cú pháp là tốt, điều này khiến tôi tin rằng các tiêu đề có sẵn nhưng lib vẫn không được liên kết. Suy nghĩ? – user2393462435

+0

@ user2393462435, bạn cần liên kết mục tiêu 'Common' với mục tiêu' MyApp' trong giai đoạn xây dựng khung theo cách thủ công (CocoaPods không quản lý mục tiêu của bạn). – Fabio

5

Các giải pháp tôi đã áp dụng cho tình trạng này là như sau:

tôi thiết lập các Podfile khá đơn giản:

workspace 'MyApp.xcworkspace' 
platform :ios, '5.0' 

xcodeproj 'Common.xcodeproj' 

pod 'AFNetworking',    '1.1.0' 
pod 'TTTAttributedLabel',   '1.6.0' 
pod 'JSONKit',     '1.5pre' 
pod 'Reachability',    '3.1.0' 

target 'MyApp' do 
    xcodeproj 'MyApp.xcodeproj' 
    # specific dependencies 
end 

Bằng cách này, lib chung và MyApp được thiết lập một cách chính xác để sử dụng tất cả các phụ thuộc. Tuy nhiên, điều này sẽ vẫn gây ra các biểu tượng trùng lặp. Cách để có được xung quanh đó là chỉ cần xóa libPods.a từ Giai đoạn xây dựng của dự án chung.Điều này là tốt bởi vì chúng tôi không thực sự muốn liên kết đến các lib tĩnh Cocoapods để lib tĩnh của chúng tôi anyway. Tất cả các phụ thuộc chính xác sẽ được liên kết khi bạn xây dựng ứng dụng và tất cả các đường dẫn tiêu đề chính xác được thiết lập trong tệp .xccconfig để Xcode/AppCode vẫn sẽ cung cấp tất cả các tính năng tự động hoàn thành của bạn và mọi thứ sẽ biên dịch.

Bạn sẽ cần phải xóa libPods.a mỗi khi bạn chạy pod install hơi đau, nhưng có thể sẽ tốt hơn là quản lý tất cả các phụ thuộc theo cách thủ công.

Cập nhật: Tôi đang làm việc này khi tôi viết và tôi vừa nhận thấy điều quan trọng là không sử dụng Linker Flags Cocoapods được thiết lập trong thư viện tĩnh của bạn. Theo mặc định, lib tĩnh của tôi đã ghi đè giá trị của chúng không có giá trị nhưng Cocoapods cảnh báo chống lại điều này và khuyên bạn nên sử dụng $ (thừa hưởng). Chỉ cần bỏ qua nó.

+0

Bạn có biết cách tự động xóa không? Tôi muốn thêm nó để máy chủ xây dựng của tôi có thể thực hiện 'cài đặt nhóm' trước mỗi bản dựng. – Wilmar

+0

Làm cách nào để bạn giải quyết vấn đề này nếu bạn có ba dự án trong cùng một thư mục. "MyApp-Core", "MyApp-iOS" và "MyApp-Mac"? – Sunkas

+0

Tôi đang gặp sự cố với nội dung 'Không có tệp hoặc thư mục' cho Podfile.lock hoặc Manifest.lock. Ngoài ra, 'sandbox không đồng bộ với Podfile.lock' –

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