|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: "[Swift][SwiftPM] Swift Package로 만든 라이브러리의 Mach-O를 Dynamic으로 만들기" |
| 4 | +tags: [] |
| 5 | +published: false |
| 6 | +--- |
| 7 | +{% include JB/setup %} |
| 8 | + |
| 9 | +일반적으로 Swift Package로 만든 라이브러리의 `Mach-O`의 기본값은 `Static` 입니다. `Dynamic` 으로 변경하려면 type을 `.dynamic` 으로 변경해야합니다. |
| 10 | + |
| 11 | +```swift |
| 12 | +// FileName : Package.swift |
| 13 | +let package = Package( |
| 14 | + name: "MyLibrary", |
| 15 | + products: [ |
| 16 | + .library(name: "MyLibrary", type: .dynamic, targets: ["MyLibrary"]), |
| 17 | + ], |
| 18 | + ... |
| 19 | +) |
| 20 | +``` |
| 21 | + |
| 22 | +위와 같이 type에 `dynamic`으로 값을 지정해야하는 경우는 `Mach-O`가 `Static`, `Dynamic`인 라이브러리를 각각 만들어야 합니다. |
| 23 | + |
| 24 | +```swift |
| 25 | +// FileName : Package.swift |
| 26 | +let package = Package( |
| 27 | + name: "MyLibrary", |
| 28 | + products: [ |
| 29 | + .library(name: "MyLibrary", targets: ["MyLibrary"]), |
| 30 | + .library(name: "MyLibrary-Dynamic", type: .dynamic, targets: ["MyLibrary"]), |
| 31 | + ], |
| 32 | + ... |
| 33 | +) |
| 34 | +``` |
| 35 | + |
| 36 | +`Mach-O`를 Dynamic으로 설정해야하는 이유는, 여러 Dynamic Framework에서 해당 라이브러리를 사용해야하기 때문입니다. 만약 `Mach-O`를 Static인 라이브러리를 의존하게 되면, 복사가 일어나기 때문입니다. |
| 37 | + |
| 38 | +그래서 별도의 `Mach-O`가 `Dynamic` 인 라이브러리를 만들게 되었습니다. |
| 39 | + |
| 40 | +--- |
| 41 | + |
| 42 | +Xcode 12.5에서는 라이브러리 코드 중복이 발생하는 경우, 패키지의 라이브러리를 Dynamic Framework로 만들어준다고 합니다. [Xcode 12.5 Release Note](https://developer.apple.com/documentation/xcode-release-notes/xcode-12_5-release-notes#Swift-Packages) |
| 43 | + |
| 44 | +``` |
| 45 | +The Swift Package Manager now builds package products and targets as dynamic frameworks automatically, if doing so avoids duplication of library code at runtime. (59931771) (FB7608638) |
| 46 | +``` |
| 47 | + |
| 48 | +즉, 여러 Dynamic 라이브러리가 패키지의 `type`이 `static`으로 설정된 라이브러리를 의존한다면, Dynamic Framework로 빌드한다는 의미입니다. |
| 49 | + |
| 50 | +<div class="mermaid" style="display:flex;justify-content:center;"> |
| 51 | +graph TD; |
| 52 | + id1[Application]-->id2[AFramework] |
| 53 | + id1[Application]-->id3[BFramework] |
| 54 | + id2-->id4(MyLibrary) |
| 55 | + id3-->id4(MyLibrary) |
| 56 | + style id1 fill:#03bfff |
| 57 | + style id2 fill:#ffba0c |
| 58 | + style id3 fill:#ffba0c |
| 59 | + style id4 fill:#ff5116 |
| 60 | +</div> |
| 61 | + |
| 62 | +위의 의존관계에서 `AFramework`, `BFramework`는 `MyLibrary`를 의존하고 있어, `MyLibrary`는 Static Library로 빌드하지 않고, **Dynamic Framework**로 빌드합니다. |
| 63 | + |
| 64 | +**[RxSwift](https://github.com/reactiveX/RxSwift)**는 별도의 Dynamic 라이브러리르 만든 대표적인 오픈소스입니다. RxSwift를 통해 정말로 Dynamic Framework로 빌드하는지 알아봅시다. |
| 65 | + |
| 66 | +## Swift Package의 라이브러리를 Dynamic Framework로 만들기 |
| 67 | + |
0 commit comments