공부

[실험] Swift Package - Static / Dynamic 중 어떤 링크 방식을 사용할까

Zedd0202 2021. 10. 1. 17:20
반응형

 

안녕하세요 :) Zedd입니다.

제곧내

그냥 실험글이고....댓글 진짜 대.환.영

 

1. 프로젝트를 만든다. 

2. File > Add Packages 

Remote에 있는거 먼저 해볼려고...

3. 아무거나 Add해준다. 

4. Package선택

SnapKit의 경우 이렇게 

SnapKit

SnapKit-Dynamic

으로 나누어진다. 

딱봐도 SnapKit은 Static, SnapKit-Dynamic은 Dynamic 같음. 

일단 SnapKit을 추가해본다.

추가 완료! 

 

내가 궁금증이 들었던 부분. 

.a, .dylib 같은 접미사 없이 그냥..그냥...그냥 있다.

그래서 Static인지 Dynamic인지 궁금했다.

이렇게 선택했으니 진짜 Static인지 알아보자.

 

빌드 후 executable file을 nm으로 살펴보면 

SnapKit안에 있는 코드들이 executable file에 복사된 것을 알 수 있다. 

Dynamic으로 바꿔보자.

 

아예 새로 Dependency를 삭제하고 다시 받아도 되는데,

여기서 SnapKit을 제거하고, + 버튼을 눌러

Dynamic을 추가해주면 된다.

 

그리고 빌드 후 똑같이 확인해보면, 아까 executable file안에 있던 코드들이 다 빠져있다. 

 

# excutable file 용량 차이

Static -> 616KB

Dynamic -> 132KB

꽤 차이가 난다. 

 

# Local Swift Package

Local Swift Package로 실험해보자.

1. File > New > Package

2. Add to에서 내 프로젝트를 선택해준다. 

오른쪽 그림처럼 보이면 된거임. 

3. Frameworks~ 쪽에 추가 

4. Library쪽에 메소드 만들어놓고 빌드.

5. nm으로 executable file보기

ㅇㅇ포함되어있음.

그니까 Local Swift Package는 기본적으로 Static으로 들어간다...라고 추측할 수 있다. 

 

🤔 : Dynamic으로 하구싶다....

🧑‍💻 : Package.swift로 가봐

type을 dynamic으로 ㅇㅇ

빌드 후 확인해보자.

foo가 없다. MyLibrary에 대한 내용도 포함이 안되어있음. 

MyLibrary에 코드가 거의 없다시피 해서 용량차이는 2KB밖에 안났다.

 


 

여기까지 실험이었고, 남은 궁금증들.

# 첫번째 궁금증. Package.swift > type

Package.swift에서 바꿔줬던 type.

dynamic으로 지정해줬으나 당연히 static도 있다. 

그럼 기본값이 .static인건가? 해서 정의를 봤다.

- 라이브러리에 링크하는 방법을 결정하는데 사용되는 optional type.

- [권장] Swift Pacakage Manager가 Static / Dynamic 중에서 선택할 수 있도록 지정하지 않은 상태로 둘 것

- Static / Dynamic을 모두 지원하지 않는 경우 .static or .dynamic을 사용할 것. 

 

이 설명을 보면 뭔가 static이 기본값도 아닌 것 같고, SPM이 선택하는 그런것 같다

그렇다면 SPM이 기본적으로 Static으로 선택하는 걸까? 어떨때 Dynamic을 선택하는거지...ㅠ

 

# 두번째 궁금증. Xcode 12.5 Release Note

(내가 이해한게 맞다면) Xcode 12.5부터 package product과 target이 dynamic framework로 빌드한다는데..

그렇다면 내 MyLibrary에 대한 Product가 Dynamic Framework로 취급되고

링크도 Dynamic으로 한다는거 아닌가 ㅎ.

 

근데 왜 dynamic으로 지정해주지 않으면 static으로 들어가는지 모르겠다!!!! 🤯 **

 

이 글에서 설명한 것들은 단순히 실험을 통해 유추한 것들이기 때문에 틀릴 수 있다. 

그러니 틀린 내용이 있다면 댓글 부탁드립니다..🙏🏻

반응형