Thư viện? Tĩnh? Năng động? Hay khung? Dự án bên trong một dự án khác


151

Tôi có một ứng dụng iOS hiện có và muốn thêm một đoạn mã lớn mà tôi đã phát triển như một dự án khác chỉ để dễ kiểm tra. Chunk mới về cơ bản liên quan đến việc lưu hình ảnh vào các dịch vụ chia sẻ khác nhau, v.v. Bởi vì mã chia sẻ đó cần rất nhiều thử nghiệm và cập nhật trong tương lai, tôi đã tự hỏi cách tốt nhất để kết hợp đoạn mã đó vào ứng dụng hiện tại của mình.

Tôi không biết nên là thư viện tĩnh, thư viện động hay khung, và thành thật mà nói, tôi không thực sự chắc chắn sự khác biệt là gì, hoặc tôi nên tìm hiểu về nó như thế nào và thiết lập nó trong Xcode.

Tất cả những gì tôi biết là tôi cần / muốn giữ một ứng dụng thử nghiệm và cập nhật riêng cho mã chia sẻ và để ứng dụng chính sử dụng nó.


Bạn có thể tạo khung ô giống như 'khung trong khung' stackoverflow.com/a/27638841/1582217
Mohd Iftekhar Qurashi 24/12/14

Câu trả lời:


204

Đầu tiên, một số định nghĩa chung (cụ thể cho iOS):

Thư viện tĩnh - một đơn vị mã được liên kết tại thời gian biên dịch, không thay đổi.

Tuy nhiên, thư viện tĩnh iOS không được phép chứa hình ảnh / tài sản (chỉ mã). Bạn có thể vượt qua thử thách này bằng cách sử dụng gói phương tiện .

Một định nghĩa tốt hơn, chính thức hơn có thể được tìm thấy trên Wikipedia ở đây .

Thư viện động - một đơn vị mã và / hoặc tài sản được liên kết trong thời gian chạy có thể thay đổi.

Tuy nhiên, chỉ Apple mới được phép tạo thư viện động cho iOS. Bạn không được phép tạo những thứ này, vì điều này sẽ khiến ứng dụng của bạn bị từ chối. (Xem bài viết SO khác này để xác nhận và lý luận về như vậy).

Khung phần mềm - một bộ mã được biên dịch để hoàn thành một nhiệm vụ ... do đó, bạn thực sự có thể có một khung tĩnh hoặc khung động , thường chỉ là các phiên bản được biên dịch ở trên.

Xem Wiki trên Khung phần mềm để biết thêm chi tiết.

Do đó, trên iOS, về cơ bản, tùy chọn duy nhất của bạn là sử dụng thư viện tĩnh hoặc khung tĩnh (sự khác biệt chính là khung tĩnh được phân phối dưới dạng .atệp được biên dịch thường xuyên nhất, trong khi thư viện tĩnh có thể được đưa vào như một tiểu dự án - bạn có thể thấy tất cả các mã - được biên dịch trước và kết quả của nó.a tệp được sử dụng làm phụ thuộc của dự án).

Bây giờ chúng tôi đã rõ (er) về các điều khoản này, việc thiết lập thư viện tĩnh và gói phương tiện hỗ trợ cho iOS không quá khó và có nhiều hướng dẫn về cách thực hiện. Cá nhân tôi muốn giới thiệu cái này:

https://github.com/jverkoey/iOS-Framework

Đây là một hướng dẫn khá đơn giản và không có nhược điểm khi xử lý "thư viện tĩnh giả" ... hãy kiểm tra để biết thêm thông tin ...

Khi bạn đã tạo thư viện tĩnh của mình, thật dễ dàng như đưa nó vào dưới dạng mô hình con trong Git để sử dụng cho các dự án khác nhau.

Chúc may mắn.

BIÊN TẬP

Về một dự án con trong một dự án, theo như tôi biết, để làm cho nó hoạt động / biên dịch chính xác, về cơ bản bạn phải thiết lập một chuỗi biên dịch trong đó tiểu dự án được biên dịch trước, tạo ra một khung tĩnh.a tệp được sử dụng như một phụ thuộc theo dự án.

Đây là một hướng dẫn hữu ích khác nói về điều này:

http://www.cocoanetic.com/2011/12/sub-projects-in-xcode/

CHỈNH SỬA 2

Kể từ iOS 8, Apple hiện cho phép các nhà phát triển tạo các khung động! (Lưu ý: ứng dụng của bạn phải có mục tiêu tối thiểu là iOS 8 để bao gồm khung động ... không cho phép chuyển ngược lại.)

Điều này đã được thêm vào như một mẫu dự án mới. Trong Xcode 6.1, điều này có thể được tìm thấy tại:

New Project -> iOS -> Framework & Library -> Cocoa Touch Framework

Cho đến nay, dường như các tiểu dự án là những gì tôi muốn và bài viết đó là hoàn hảo. Tôi đã nhận thấy một tác dụng phụ kỳ lạ: Dự án con mà tôi đã kéo trong dự án chính của mình cũng có mã thử nghiệm của tôi (viewcontroll và nib, appdelegate, v.v.) và tôi đã chắc chắn rằng chỉ các lớp mà tôi muốn sử dụng trong dự án chính được kiểm tra để sử dụng trong thư viện tĩnh. Nhưng vì một số lý do, khi tôi đi thực hiện các tệp đính kèm vào tệp nib của dự án chính của mình, nó cũng cho thấy các cửa hàng và hành động từ tiểu dự án của tôi. Điều này chắc chắn có thể dẫn đến một số nhầm lẫn. Bất kỳ lời khuyên để thoát khỏi những? Cảm ơn!
pizzafilms

Một dự án động có thể được kéo và thả vào một dự án tĩnh, do đó làm cho nó trở thành một dự án tĩnh không? Tôi thực sự bối rối, một số làm rõ sẽ thực sự tuyệt vời! Cảm ơn trước :-)
Ravindranath Akila

1
@ JRG-Nhà phát triển Quay lại khung động được cho phép nếu bạn tuân theo một số quy tắc: developer.apple.com/l
Library / prelelease / ios / document / /

Có thể đặt mục tiêu tối thiểu thấp hơn và làm cho thư viện tùy chọn không?
kukudas

1. bạn có thể bao gồm một số ví dụ nổi tiếng của thư viện tĩnh, thư viện động, khung không? 2. Bạn có thể đưa ra ví dụ về nơi bạn sẽ cần phải làm như vậy? 3. Tò mò có gì khác biệt giữa một nhóm và thư viện tĩnh?
Mật ong

29

Định dạng tệp Mach-O (Đối tượng Mach - .o)

Trong thế giới iOS, mọi tệp nguồn được chuyển đổi thành tệp đối tượng - ABI [Giới thiệu] Tệp Mach-O [Giới thiệu] sẽ được đóng gói thành gói thực thi cuối cùng (ví dụ: ứng dụng, khung ...), tệp (ví dụ: thư viện ...) và hành vi của nó được xác định bởi Mach-O type[Giới thiệu]

Packagelà một thư mục hoạt động như một tập tin - opaque file. Nó được tạo ra cho trải nghiệm người dùng để làm phức tạp việc thực hiện một số thay đổi thành cấu trúc bên trong có thể gây ra hành vi chương trình không thể đoán trước. Gói được sử dụng trong Document Packagehoặc với một Bundle. Bạn có thể sử dụng Show Package Contentstrong Finder

Bundlelà một thư mục có cấu trúc cụ thể để tổ chức nhị phân (mã thực thi) và tài nguyên cho mã đó (ví dụ: hình ảnh, ngòi ...). Gói chứa tệp Info.plist[Giới thiệu] . Gói được tạo ra cho kinh nghiệm phát triển . Ngoài ra nó có thể được đóng gói. Có một số loại bó:

  • application bundle - Application target
  • framework bundleversioned bundlenhư là một kiểu con -Framework Target
  • loadable bundle(aka plug-in bundle) - Bundle target(Gói thử nghiệm giao diện người dùng, Gói thử nghiệm đơn vị)
  • những người khác ( dSYM[Giới thiệu] bó)

Application- .ipa, .app[Giới thiệu] - packaged application bundle- chương trình có thể khởi chạy.

Tests- packaged loadable bundleđược sử dụng để kiểm tra nhị phân. Kiến trúc trình cắm cho phép chúng tôi thêm một chức năng mới (trường hợp thử nghiệm) dưới dạng một mô-đun riêng biệt vào nhị phân hiện có

Thư viện và khung

Martin Fowler trên InversionOfControl

Thư viện về cơ bản là một tập hợp các hàm mà bạn có thể gọi, ngày nay thường được tổ chức thành các lớp. Mỗi cuộc gọi thực hiện một số công việc và trả lại quyền điều khiển cho máy khách.

Một khung thể hiện một số thiết kế trừu tượng, với nhiều hành vi được xây dựng hơn. Để sử dụng nó, bạn cần chèn hành vi của mình vào các vị trí khác nhau trong khung bằng cách phân lớp hoặc cắm vào các lớp của riêng bạn. Mã của khung sau đó gọi mã của bạn tại các điểm này. Kiểm soát chính của chương trình được đảo ngược, chuyển từ bạn sang khuôn khổ. (Đảo ngược kiểm soát)

Thư viện và khung trên iOS

Librarylà một tập hợp các tệp đối tượng Mach-O [kiểm tra tĩnh hoặc động] được biên dịch cho một hoặc nhiều kiến ​​trúc.

Static library- .a(còn gọi là thư viện lưu trữ tĩnh, thư viện chia sẻ được liên kết tĩnh [doc] ) - Khi bạn thêm nó vào ứng dụng của mình, trình liên kết tĩnh trong thời gian biên dịch sẽ hợp nhất các tệp đối tượng từ thư viện và gói chúng cùng với các tệp đối tượng ứng dụng vào một tệp thực thi duy nhất tập tin. Nhược điểm là một tập tin đầu ra lớn

Từ Xcode 9.0, thư viện tĩnh Swift được hỗ trợ.

Dynamic library- .dylib(còn gọi là thư viện chia sẻ động, đối tượng chia sẻ, thư viện được liên kết động [doc] ) được liên kết động với khả năng thực thi của ứng dụng khi tải hoặc thời gian chạy , nhưng không được sao chép vào nó. Trên gói ứng dụng thực hành sẽ chứa thư mục Khung có .dylibtệp. Tất cả các thư viện hệ thống iOS và macOS đều được dynamic. Nhược điểm là thời gian khởi chạy chậm vì tất cả các thư viện động nên được sao chép và liên kết.

[Liên kết tĩnh và liên kết động]

Text-based stub library- .tbd[Giới thiệu] , đó là một gốc văn bản dynamic libraryđược đặt trên thiết bị đích. Kết quả là bạn không nên gói một thư viện động vào gói của bạn. Nó có hiệu ứng kích thước.

Frameworkaka binary framework- .frameworklà một not packaged framework bundle(để cho phép các nhà phát triển dễ dàng xem xét các tiêu đề và tài nguyên) có chứa static or dynamicthư viện, tệp tiêu đề và tài nguyên được biên dịch .

Static frameworkchứa một static librarygói với tài nguyên của nó.

Dynamic frameworkchứa dynamic libraryvà tài nguyên. Ngoài ra, khung động có thể bao gồm các phiên bản khác nhau của cùng một thư viện động trong một gói ( versioned bundle)

[Khung tĩnh so với động]

Embedded frameworklà một dynamic frameworkcuộc sống trong hộp cát của ứng dụng. Loại này được tạo trước hết để mở rộng để chia sẻ mã và tài nguyên chung. Nó khả dụng khi mục tiêu Triển khai là iOS 8+.

Umbrella framework [Mục tiêu tổng hợp] là một khung chứa các khung khác. Nó không được hỗ trợ chính thức trên iOS và đó là lý do tại saocác nhà phát triển không khuyến nghị tạo chúng [Tài liệu chính thức] . Trên thực tế, đó là một tập hợp các khung con (hoặc Khung lồng nhau). Khi bạn tạo một khung có phụ thuộc, người tiêu dùng (chẳng hạn như ứng dụng) có trách nhiệm thêm phụ thuộc này cùng với khung của bạn vào dự án. Là một nhà phát triển, việc cố gắng tìm cách chuyển nghĩa vụ này từ người tiêu dùng sang của bạn là điều tự nhiên. Kết quả là bạn nghĩ rằng đóUmbrella frameworklà giải cứu nhưng thường nó dẫn đến một vấn đề nghiêm trọng với việc quản lý các phiên bản và sự phức tạp của việc tạo và hỗ trợ nó.

Fake Framework- là kết quả của các hoạt động cụ thể theo a static libraryđể tạo ra một gói có .frameworkphần mở rộng sẽ tự hành xử như một dynamic framework. Kỹ thuật này đã được sử dụng khi Xcode không hỗ trợ tạo khung do không có mẫu khung. Một trong những nhận thức của một khuôn khổ giả . Với Xcode 6, Apple đã bổ sung hỗ trợ khung iOS.

Modular Framework[Giới thiệu] -@importđó là một khung chứa.modulemaptệp bên trong. Mô-đun có thể chứa các mô hình con. Ưu điểm chính là bạn tiết kiệm thời gian xây dựng vớiModular Framework.

Universal Library or Framework(còn gọi là Fat) [lipo] [Mục tiêu tổng hợp] chứa nhiều kiến ​​trúc. Ví dụ: bản dựng phát hành của bạn nên hỗ trợ một số vòm mà bạn có thể điều chỉnh thông qua Build Active Architecture Only [CHỈ_ACTIVE_ARCH]

Dependency[Giới thiệu] Bạn có thể sử dụng mã của bên thứ ba như một phần của mục tiêu của mình. Nó cho phép bạn sử dụng lại mã từ rất nhiều nguồn như - dự án khác, dự án trong cùng một không gian làm việc, mục tiêu khác, thư viện, khung, v.v.

Cách xây dựng và sử dụng Thư viện tĩnh:

Cách xây dựng và sử dụng Khung động [thay đổi thành tĩnh]

[Hệ thống xây dựng Xcode]
[Thành phần Xcode]
[Trình liên kết động]


1
Trong nhiều hướng dẫn của Swift, có đề cập rằng Objective C không hỗ trợ các thư viện động, khi mà swift hỗ trợ, [ altexsoft.com/blog/engineering/ mẹo ] Nhưng như tôi biết, OS8 trở đi Objctive C hỗ trợ thư viện Động. Bạn có thể làm rõ điều này?
pratima

@pratima, bạn có thể tạo khung động trên Objective-C cho iOS
yoAlex5

1
"Khung tĩnh chứa một thư viện tĩnh được đóng gói với các tài nguyên của nó." Định nghĩa này đến từ đâu? AFAK, giai đoạn xây dựng "Sao chép tài nguyên gói" của khung công tác tĩnh không hoạt động, giống như thư viện tĩnh. Sự khác biệt giữa khung tĩnh và thư viện tĩnh là gì?
toshi0383

@ toshi0383 Bạn có tìm cách hợp nhất thư viện tĩnh (.a) và đó là tài nguyên (.bundle) thành một khung duy nhất mà chúng tôi có thể phân phối cho người tiêu dùng không?
dùng121095

2

Bạn cũng có thể tạo tệp .podspec cho CocoaPods ( http://guides.cocoapods.org/making/private-cocoapods.html#1.-create-a-private-spec-repo ) và sử dụng nó như bất kỳ nhóm nào khác với chỉ khác nhau rằng đó là nhóm riêng tư của bạn và không thể nhìn thấy được với thế giới bên ngoài (Tôi không chắc điều gì sẽ xảy ra nếu nhóm của bạn tạo mô hình CoreData, nhưng tôi không hiểu như vậy).

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.