[실험] Swift Package - Static / Dynamic 중 어떤 링크 방식을 사용할까
안녕하세요 :) 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으로 들어가는지 모르겠다!!!! 🤯 **
이 글에서 설명한 것들은 단순히 실험을 통해 유추한 것들이기 때문에 틀릴 수 있다.
그러니 틀린 내용이 있다면 댓글 부탁드립니다..🙏🏻