Skip to content

Commit c1cafea

Browse files
committed
update
1 parent 49643b3 commit c1cafea

2 files changed

Lines changed: 68 additions & 3 deletions

File tree

_posts/2022/01/2022-01-05-ios-only-using-swiftpm-rxblocking-rxtest-on-unit-test.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,7 @@ Xcode 13.0 버전을 사용해서 아래에 제시된 방법을 사용하는 것
4545

4646
해당 문제가 이슈화된지는 오래되었습니다. 버그 리포트 [https://bugs.swift.org/browse/SR-12303](https://bugs.swift.org/browse/SR-12303)에도 이 문제에 대한 이슈가 올라왔으며, RxSwift 저장소의 오래된 [이슈](https://github.com/ReactiveX/RxSwift/issues/2127)이기도 했습니다. 또한, 트위터에서도 이 문제를 해결하기 위한 [대화](https://twitter.com/freak4pc/status/1233465169189228544?s=20)가 이루어졌습니다.
4747

48-
Xcode 12.5 Release Note에서는 Swift Package에 대한 업데이트가 포함되어 있습니다.
49-
50-
[Xcode 12.5 Release Note]((https://developer.apple.com/documentation/xcode-release-notes/xcode-12_5-release-notes#Swift-Packages))에서는 Swift Package에 대한 업데이트가 포함되어 있습니다.
48+
[Xcode 12.5 Release Note](https://developer.apple.com/documentation/xcode-release-notes/xcode-12_5-release-notes#Swift-Packages)에서는 Swift Package에 대한 업데이트가 포함되어 있습니다.
5149

5250
```
5351
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)
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
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

Comments
 (0)