제라스의 Swift 공부/iOS 개발 오류

[iOS 개발 오류] Xcode에서 Package가 tag없이 업데이트가 안되는 이슈를 해결해보자!

Xerath(제라스) 2024. 9. 1. 03:21
728x90
반응형

서론

안녕하세요! iOS 개발자 Xerath입니다~!👋🏻 🤖 👋🏻

 

여러분은 다들 iOS 개발하시면서 Package 생성을 해서 많이 개발해보셨나요??

저는 예전에 네이버 부스트캠프 그룹 프로젝트를 하면서 딱 한번 Modular Architecture를 도입하게 되면서

Package로 쪼개어서 개발을 해보았는데요...!

 

그 이후론 따로 빼서 개발을 잘...안 해보다보니 잘 나눌 줄은 모릅니다 쥬르륵...ㅠㅠ

 

그럼 어떻슴까!?

해봐야죠!! ㅎㅎㅎ 해보면 되는거 아니겠슴까!

자신감! 개발은 자신감! 부딪히고 깨지고 어..?

 

그래서 시작했는데 마주한 업데이트 시의 이슈와 해결방법을 공유해보고자 합니다!

그럼 시작해보겠습니다라다랏~!!🏃🏻🏃🏻🏃🏻‍♂️

Package를 만들고 새로운 태그를 푸쉬한 후 업데이트를 해보아요!

가볍게 저는 XerathPackage란 패키지를 만들고 XerathProject란 프로젝트를 팠습니다!

(직관적인 네이밍...!ㄷㄷㄷ)

 

그래서 XerathPackage를 Github에 배포해둔 뒤 XerathProject에서 갖다 쓰려고 했는데...!

보통 그렇듯 패키지다보니 tag를 달아서 푸쉬를 해주었어요!

 

근데...! 근데...!

위와 같이 A, B 코드를 1.0.0 태그로 올려두고,

C, D 코드를 1.0.1 태그로 올려두고,

마~~~~~지막으로 E 코드를 1.0.2 태그로 올려두었다고 합시다!

이런 식으로 하면 Xcode는 태그를 기준으로 Package가 변경된 걸 인지하고 새로 가져옵니다.

 

이때, 바뀌는 건 Package.resolved라는 파일에서 state.revision과 version입니다.

얘네는 사실 tag가 새로 생겨있다면

자동으로! 스스로! 알아서!

그 태그가 가리키는 커밋의 Hash값과 tag에 맞춰서 변경됩니다.

 

// Package.resolved

{
  "originHash" : "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
  "pins" : [
    {
      "identity" : "xerathpackage",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/yoondj98/XerathPackage.git",
      "state" : {
        "revision" : "8045d30eae6401650ece6ca8230cd339fdab9bad", // 요놈(commit hash값)
        "version" : "1.0.2" // 요놈(commit tag)
      }
    }
  ],
  "version" : 3 // 요 친구는 안 바뀜! SPM의 버젼임! Apple이 SPM 업데이트 시 변경됨
}

 

이건 제가 1.0.2 태그로 어떤 커밋 내역을 새로 푸쉬한 후 받아왔을 때의 Package.resolved의 내용입니다.

 

아하! 간단하네!

 

새로운 태그(버젼)가 있으면 Update Package를 하면

그거에 맞춰서 Package.resolved의 revision값, version값이 바뀌는구나?!

 

이건, WWDC19 영상을 보시면 더 자세히 아실 수 있습니다!

https://developer.apple.com/videos/play/wwdc2019/408/

 

Adopting Swift Packages in Xcode - WWDC19 - Videos - Apple Developer

Swift packages are a great way to organize and share code, and are now supported while building apps for all Apple platforms in Xcode 11...

developer.apple.com

 

근데...!! 제가 마주한 문제는 다음과 같은 상황에서 발생했습니다.

새로운 태그없이 태그가 가리키는 Commit을 바꾸면 반영이 안될까??

 

지금 상태가 위 그림과 같은 상태잖아요?

근데 저는 F라는 애를 추가할 건데 1.0.3으로 할게 아니라 1.0.2에 넣어두고 싶습니다..!

 

지금 XerathProject에서는 XerathPackage 1.0.2(A~E)버젼을 가져다 쓰고 있거든요?

근데 1.0.2에 새로 F가 추가된다고 하면...!

Xcode가 인지를 못하더라구요!!!

허거걱...!

Update Package를 해보아도...! Reset, Package를 최신 버젼으로 Update를 해보아도...!

이렇게 해보아도 새로 F 코드를 못가져옵니다..!!

Clean Build Folder를 했는데도 안되더라구요 ㅎㅎㅎ

무지성 트라이한 방법들도 있지만 외않되??외않되??외않되?? 무한반복...

 

아니...그럼 어떻게 해야하느냐...??!!

해결: Package.resolved의 revision값을 바꾸기

이렇게 고민이 많던 제라스...

어떤 천사와도 같은 분께서 도움을 주십니다.

진짜 알다브라코끼리 육지거북이 보다도 더 오래사세요!!ㅠㅠ

 

Package.resolved 파일에서 revision 값을 바꿔주면 됩니다...!

version도 만약 수정된 부분이 있다면 바꿔주시고,

사실 수정이 아니라 추가만 되었다면 안 바꿔도 문제는 없습니다만...

 

다 필요없고! 이 커밋의 tag에 맞게만 version을 바꿔주시면 됩니다!

그게 정석이자, 당연한 거니까 ㅎㅎㅎ

그럼 어떻게 바꾸는데...?

간단합니다!

 

일단 Finder에서 해당 프로젝트를 들어가서,

 

(프로젝트).xcodeproj를 우클릭해서 Show Package Contents를 클릭.

 

(프로젝트).xcworkspace를 우클릭해서 Show Package Contents를 클릭.

 

그 후 xcshareddata-swiftpm을 들어가면,

요로코롬~~ Package.resolved가 있습니다!

 

이 친구를 TextEditor로 열어줍시다!

 

그러고나면, 

// Package.resolved

{
  "originHash" : "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
  "pins" : [
    {
      "identity" : "xerathpackage",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/yoondj98/XerathPackage.git",
      "state" : {
        "revision" : "8045d30eae6401650ece6ca8230cd339fdab9bad", // 요놈(commit hash값)
        "version" : "1.0.2" // 요놈(commit tag)
      }
    }
  ],
  "version" : 3 // 요 친구는 안 바뀜! SPM의 버젼임! Apple이 SPM 업데이트 시 변경됨
}

 

요런 애가 나오거든요??

그럼 이때 revision에다가 내가 새로 올려둔 커밋의 해쉬값을 넣어줄 겁니다!

해쉬값은 어디 있느냥녕뇽냥??

 

요기에 Commit 내역에 들어가서,

 

내가 적용하고자 하는 최신 Commit에서 저 복사 버튼을 누르면,

해당 Commit의 전체 해쉬 값을 복사할 수 있습니다! 👍🏻😆👍🏻

 

그러고 저걸 아까 Package.resolved의 revision에 넣어두고 저장해주면 됩니다!

 

간단하죠 ㅎㅎ

마무리

늘 새로운 패키지를 만들어는 보아도

기존 Tag에 적용을 하고 그걸 적용해오는 상황을 마주치진 않았던 것 같습니다.

 

아 물론!

이 방법말고도 다른 방법들이 있을 것이란 생각이 듭니다 ㅎㅎ

 

하지만, 이런 방법도 있다~~~정도로 봐주시구,

 

꼭 다른 방법이 있다면 제게 알려주세여 매애애애앤~~~~

 

그럼 오늘도 포스팅 읽어주셔서 감사합니다!

참고

https://developer.apple.com/videos/play/wwdc2019/408/

 

Adopting Swift Packages in Xcode - WWDC19 - Videos - Apple Developer

Swift packages are a great way to organize and share code, and are now supported while building apps for all Apple platforms in Xcode 11...

developer.apple.com

https://lsj8706.tistory.com/32

 

Adopting Swift Packages in Xcode

https://developer.apple.com/videos/play/wwdc2019/408/ Adopting Swift Packages in Xcode - WWDC19 - Videos - Apple Developer Swift packages are a great way to organize and share code, and are now supported while building apps for all Apple platforms in Xcode

lsj8706.tistory.com

https://telemetrydeck.com/docs/articles/update-package/

 

How to update a Swift package | TelemetryDeck

Xcode doesn't update packages automatically. How do you tell Xcode to update to the newest version of a Swift Package? Or update all packages at once?

telemetrydeck.com

https://stackoverflow.com/questions/39750454/how-to-update-swift-dependencies-in-xcode

 

How to update Swift dependencies in Xcode

After I create a new swift package with dependencies I call swift package generate-xcodeproj. If my dependencies have a new version I call swift package update. The new version of my dependency gets

stackoverflow.com


아직 꼬꼬마 개발자입니다.

더 나은 설명이나 코드가 있다면 언제든 환영입니다.

적극적인 조언과 피드백 부탁드립니다!

 

그럼 오늘도 개발 가득한 하루되세요!

- Xerath -

🤖🤖🤖🤖🤖🤖🤖

728x90
반응형